Problème INSERT INTO

Petit nouveau ! | 4 Messages

03 avr. 2012, 09:23

Bonjour à tous,

Je rencontre actuellement un problème sur une insertion de données depuis PHP vers un serveur iSeries. En effet, dans le code suivant il semblerait qu'il y ait un problème au niveau de l'insertion des variables $lignes[0], $lignes[1]... Ces données proviennent d'un formulaire pré-rempli.

Voici mon code :
<?php


	
if(isset($_POST['sujet']))      $sujet=$_POST['sujet'];
else      $sujet="";	

$date_msg = date("Ymd");

// On passe le message dans $msg
$msg=$_POST['msg'];

// On saute une ligne tous les 30 caractères
$msg_ok = wordwrap($msg, 30, "<br />\n");

// On spécifie que chaque ligne correspondra à une ligne d'un tableau et ceux à chaque retour à la ligne
$lignes = explode("\n", $msg_ok);

// Pour chaque éléments retournés on va faire une requête
foreach($_POST['envoi_msg'] as $ID_VRP)

//Connexion As400
	$server = '192.168.150.1';
	$dsn = 'as400';  
	$user = 'fco';
	$passwd = 'pouet';
	$conn = odbc_connect($dsn,$user,$passwd);

// Insertion du message dans MS101
 	$insert_msg = "INSERT INTO TEST.MS101P(
			MBSUJ,
			MBMS1,
			MBMS2,
			MBMS3,
			MBMS4,
			MBMS5,
			MBBTQ,
			MBDAT,
			MBDEV) VALUES
		(
				'$sujet',
				'$lignes[0]',
				'$lignes[1]',
				'$lignes[2]',
				'$lignes[3]',
				'$lignes[4]',
				'$ID_VRP',
				'$date_msg',
				'$date_msg'
		)";
		
$as400_insert_msg = odbc_exec($conn,$insert_msg);
L'insertion fonctionne très bien sans les $lignes[x]. Qu'est ce que je rate je n'arrive pas à m'y retrouver ! #-o

Merci de vos réponses !

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

03 avr. 2012, 09:33

Essaie avec cette syntaxe.
$insert_msg = "INSERT INTO TEST.MS101P(
                       MBSUJ,
                       MBMS1,
                       MBMS2,
                       MBMS3,
                       MBMS4,
                       MBMS5,
                       MBBTQ,
                       MBDAT,
                       MBDEV)
             VALUES(
                    '".$sujet."',
                    '".$lignes[0]."',
                    '".$lignes[1]."',
                    '".$lignes[2]."',
                    '".$lignes[3]."',
                    '".$lignes[4]."',
                    '".$ID_VRP."',
                    '".$date_msg."',
                    '".$date_msg."')";

ViPHP
ViPHP | 2577 Messages

03 avr. 2012, 09:42

Tu devrais utiliser les fonctions odbc_errormsg() et odbc_error() pour controler la bonne exécution.
En cas d'erreur, affiche le message d'erreur et le code SQL. Tu pourras certainement voir le problème immédiatement. Dans ton cas "...$ligne[0]..." ne doit pas se comporter comme tu le penses (d'ou la solution proposée ci-dessus).

Petit nouveau ! | 4 Messages

03 avr. 2012, 10:05

Merci pour vos réponses. Cette syntaxe ne fonctionne pas non plus.

J'ai regardé les logs httpd et voici l'erreur retournée :

Code : Tout sélectionner

SQL error: [unixODBC], SQL state S1000 in SQLExecDirect .... on line 51
La ligne 51 correspond à la dernière instruction
$as400_insert_msg = odbc_exec($conn,$insert_msg);

Petit nouveau ! | 4 Messages

03 avr. 2012, 10:43

J'ai avancé un peu et il semblerait que les variables provenant de $lignes[x] ne soit pas reconnues comme STRING. Y-a-t-il un moyen pour convertir tout le tableau (toutes les cellules du tableau) en string pour que l'insertion fonctionne ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 avr. 2012, 11:29

affiche le contenue de la requete.

PHP est un langage dit peu typé donc une une chiffre c'est une chaîne et vice versa !

vérifier ce qu'il y a dans tes variables avant de les utiliser.
Est ce qu'elle existe ?

quand a ton code que vient faire le foreach ? ($_POST['envoi_msg' c'est un tableau ?)

ajout un var_dump($lignes); avant le foreach

ajoute un var_dump($insert_msg ); dans le foreach

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

03 avr. 2012, 13:34

Comme dit précédemment, tu devrais utiliser les fonctions odbc_errormsg() et odbc_error() pour controler la bonne exécution et afficher le message d'erreur ainsi que l'ordre SQL. L'affichage de la requete SQL permet de vérifier qu'elle correspond bien à ce que tu veux générer.

Il est possible que ODBC interprete 2 simples quotes comme un caractère spécial (pour $ligne[4] qui est vide). A moins que la zone ne puisse pas être vide. Essayes à tout hasard de mettre un blanc lorsque $ligne[x] est vide.

Petit nouveau ! | 4 Messages

03 avr. 2012, 15:44

Bon j'ai trouvé !
En fait je ne cherchais pas au bon endroit. Merci moogli! j'ai donc fait un var_dump($lignes); de mes variables et je me suis aperçu que la 1ère ligne était composée de 34 caractères alors que je le l'avais configuré pour 30.
L'erreur se trouvait dans le wordwrap, j'ai donc remplacé :
$msg_ok = wordwrap($msg, 30,< \br> "\n");
par
$msg_ok = wordwrap($msg, 30, "\n");
Après ça la découpe était ok et l'insertion également.

Merci pour le var_dump ça m'a permis de tilter sur le nombre de caractères !

En tout cas merci pour vos réponses.