[SQL] Problème INSERT clause WHERE
Résolu
Durst1805
-
Durst1805 -
Durst1805 -
Bonjour, je rencontre un problème bénin, de syntaxe surement, mais je n'arrive pas à trouver d'exemple concrets sur le net.
Voilà j'ai une fonction casesriviere() qui est sensée ajouter du code HTML dans la colonne image de ma table casesmap.
La colonne où le code doit être ajouté, est définie par un chiffre aléatoire grâce à un rand. J'aimerais donc utiliser le résultat de $rand pour définir la colonne où va s'ajouter le code HTML, grâce à une condition dans la clause WHERE de ma requête INSERT.
Voici le code de ma fonction :
Je pense donc que c'est au niveau de la condition de WHERE que ça coince, car je n'ai pas d'erreur PHP en retour. Quand je vérifie ma base de donnée, aucune entrée ne contient le code HTML dans la colonne image.
Merci d'avance, je pense pas que ce soit un gros problème, mais je ne suis que novice en SQL donc difficile pour moi de savoir si ma requête est correctement formulée.
Voilà j'ai une fonction casesriviere() qui est sensée ajouter du code HTML dans la colonne image de ma table casesmap.
La colonne où le code doit être ajouté, est définie par un chiffre aléatoire grâce à un rand. J'aimerais donc utiliser le résultat de $rand pour définir la colonne où va s'ajouter le code HTML, grâce à une condition dans la clause WHERE de ma requête INSERT.
Voici le code de ma fonction :
function casesRiviere() { //paramètre de connexion à la base de données $hote = 'localhost'; $utilisateur = 'administrateur'; $mdp = 'motdepasse'; $connexion = mysql_connect ($hote, $utilisateur, $mdp); $bdd = 'ile'; //connexion à la base de donnée mysql_select_db($bdd, $connexion); while ($i==1) { $rand = rand(0,143); if($rand == 0|1|2|3|4|5|6|7|8|9|10|11|132|133|134|135|136|137|138|139|140|141|142|143) { $riveH = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'"; $query3 = mysql_query($riveH, $connexion); $i=0; } elseif($rand == 12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131) { $riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'"; $query4 = mysql_query($riveD, $connexion); $i=0; } else { $rand = rand(0,143); } } }
Je pense donc que c'est au niveau de la condition de WHERE que ça coince, car je n'ai pas d'erreur PHP en retour. Quand je vérifie ma base de donnée, aucune entrée ne contient le code HTML dans la colonne image.
Merci d'avance, je pense pas que ce soit un gros problème, mais je ne suis que novice en SQL donc difficile pour moi de savoir si ma requête est correctement formulée.
A voir également:
- [SQL] Problème INSERT clause WHERE
- Touche insert - Guide
- Where is it - Télécharger - Gestion de fichiers
- Disk boot failure insert system disk and press enter - Guide
- Logiciel sql - Télécharger - Bases de données
- Activer touche insert sur ASUS UX32A - Forum Clavier
19 réponses
Salut,
Oui la syntaxe du 'elseif' c'est bon.
La requête SQL semble OK.
Note : tu aurais pu faire l'usage de la fonction : 'mysql_real_escape_string( )' pour échapper le code HTML de l'image...
Par contre ton test :
Ça me fait bizarre !...
En lisant ça, l'interpréteur PHP pour moi, calcul le 'OU' binaire de 12 OU 24 OU 36... 119 OU 131 est vérifie que la valeur obtenue est égale à $rand. Bref, pour moi, il passe directement à la clause 'else'.
Si je crois comprendre ce que tu veux faire, ce serait plutôt :
if( $rand == 12 || $rand == 24 || ...... || $rand == 119|| $rand == 131)
Si c'est le cas, au niveau propreté tu devrais peut-être plutôt faire :
Amicalement,
S@M...
http://kryoportail.ath.cx
Oui la syntaxe du 'elseif' c'est bon.
La requête SQL semble OK.
Note : tu aurais pu faire l'usage de la fonction : 'mysql_real_escape_string( )' pour échapper le code HTML de l'image...
Par contre ton test :
if($rand == 12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131)
Ça me fait bizarre !...
En lisant ça, l'interpréteur PHP pour moi, calcul le 'OU' binaire de 12 OU 24 OU 36... 119 OU 131 est vérifie que la valeur obtenue est égale à $rand. Bref, pour moi, il passe directement à la clause 'else'.
Si je crois comprendre ce que tu veux faire, ce serait plutôt :
if( $rand == 12 || $rand == 24 || ...... || $rand == 119|| $rand == 131)
Si c'est le cas, au niveau propreté tu devrais peut-être plutôt faire :
$a1 = explode( '|', '0|1|2|3|4|5|6|7|8|9|10|11|132|133|134|135|136|137|138|139|140|141|142|143' ); $a2 = explode( '|', '12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131' ); ..... if( in_array( $rand, $a1 ) ) { .... } elseif( in_array( $rand, $a2 ) ) { .... } else { $rand = rand(0,143); }
Amicalement,
S@M...
http://kryoportail.ath.cx
Re,
Même si ta table en base de données semble simple, peux-tu exporter la table 'casesmap' que je puisse essayer ?
(Onglet 'Exporter' sous phpmyadmin ).
----------------------
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] );
Protège les caractères spéciaux de la chaîne
Voir: https://www.php.net/mysql_real_escape_string
Et on s'en sert comme ceci :
Le mieux c'est de passer systématiquement par cette fonction pour convertir toute variable introduite dans une requête MySQL. Cela permet d'éviter les 'injections SQL', en particulier lorsque les variables proviennent de l'utilisateur...
Voir: https://fr.wikipedia.org/wiki/Injection_SQL
----------------------
Amicalement,
S@M...
http://kryoportail.ath.cx
Même si ta table en base de données semble simple, peux-tu exporter la table 'casesmap' que je puisse essayer ?
(Onglet 'Exporter' sous phpmyadmin ).
----------------------
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] );
Protège les caractères spéciaux de la chaîne
Voir: https://www.php.net/mysql_real_escape_string
Et on s'en sert comme ceci :
$HtmlImg = mysql_real_escape_string ( '<img src="../images/riveD.png" alt="" />', $connexion ); $MyQuery = "INSERT INTO `casesmap` ( `image` ) VALUES ( '{$HtmlImg}' )"
Le mieux c'est de passer systématiquement par cette fonction pour convertir toute variable introduite dans une requête MySQL. Cela permet d'éviter les 'injections SQL', en particulier lorsque les variables proviennent de l'utilisateur...
Voir: https://fr.wikipedia.org/wiki/Injection_SQL
----------------------
Amicalement,
S@M...
http://kryoportail.ath.cx
Bonsoir,
Est-ce normal que else if soit attaché ?
Essaye ça pour voir... =$
else if($rand == 12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131)
{
$riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'";
$query4 = mysql_query($riveD, $connexion);
$i=0;
}
else { $rand = rand(0,143); }
}
}
Est-ce normal que else if soit attaché ?
Essaye ça pour voir... =$
else if($rand == 12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131)
{
$riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'";
$query4 = mysql_query($riveD, $connexion);
$i=0;
}
else { $rand = rand(0,143); }
}
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Non ça ne change rien, et il me semble bien que la syntaxe de elseif est correcte, je crois que c'est une sorte de raccourci.
Ok merci, je ne connaissais pas du tout cette syntaxe que tu me propose. J'essaie de la mettre en œuvre dans la journée et je te tiens au courant.
Merci.
Merci.
Apparement je n'ai pas su utiliser au mieux tes conseils.
Avec ce code ci-dessous, rien n'a changé : toujours pas d'erreur SQL ou PHP, mais aucun résultat visible dans la BDD.
Peut-être que je n'ai pas correctement formulé tout ça. Je suppose que 'explode' permet de construire un tableau ? par contre je ne sais pas pourquoi il y un '|' au début et | | | entre les nombres. Ensuite la condition des if (in_array( $rand, $a1 )) qu'est-ce que ça fait au juste ? ça compare si $rand existe bien dans $a1 ?
Avec ce code ci-dessous, rien n'a changé : toujours pas d'erreur SQL ou PHP, mais aucun résultat visible dans la BDD.
function casesRiviere() { //paramètre de connexion à la base de données $hote = 'localhost'; $utilisateur = 'root'; $mdp = ''; $connexion = mysql_connect ($hote, $utilisateur, $mdp); $bdd = 'ile'; //connexion à la base de donnée mysql_select_db($bdd, $connexion); while ($i==1) { $rand = rand(0,143); $a1 = explode( '|', '0|1|2|3|4|5|6|7|8|9|10|11|132|133|134|135|136|137|138|139|140|141|142|143' ); $a2 = explode( '|', '12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131' ); if(in_array( $rand, $a1 )) { $riveH = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'"; $query3 = mysql_query($riveH, $connexion); $i=0; } else if(in_array( $rand, $a2 )) { $riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'"; $query4 = mysql_query($riveD, $connexion); $i=0; } else { $rand = rand(0,143); } } }
Peut-être que je n'ai pas correctement formulé tout ça. Je suppose que 'explode' permet de construire un tableau ? par contre je ne sais pas pourquoi il y un '|' au début et | | | entre les nombres. Ensuite la condition des if (in_array( $rand, $a1 )) qu'est-ce que ça fait au juste ? ça compare si $rand existe bien dans $a1 ?
Bon après avoir insérer comme condition à mes if ( $rand == 1 || $rand == 2 || rand == 3 || .... ) celà ne fonctionne toujours pas. Bizarre, je m'explique : au début je pensais que c'était peut-être parce que, à chaque rebouclage, le dernier else qui demande à $rand de créer un nouveau chiffre pour qu'il puisse tomber juste à un moment (else $rand (0, 143);) , ne fonctionnait pas. Mais en y réfléchissant, la boucle ne bouclerait jamais si elle ne tombait pas juste à un moment, car la condition de bouclage ne se résolve qu'a l'intérieur d'un des deux if ($i = 0).
Peut-être donc qu'il y a une erreur dans l'insertion du code HTML dans la table casesmap.
Je pensais aussi que ma fonction n'étais peut-être pas appelée correctement, c'est pourquoi je poste le code complet de mon petit programme :
Voilà.
Peut-être donc qu'il y a une erreur dans l'insertion du code HTML dans la table casesmap.
Je pensais aussi que ma fonction n'étais peut-être pas appelée correctement, c'est pourquoi je poste le code complet de mon petit programme :
<?php function ajoutCases() { for ($i=0, $num=0; $i<144; $i++,$num++) { //création des cases initiales $zone='<div class="case" id="case'.$num.'">'; $img='<img src="../images/case.png" alt="" />'; $fin='</div>'; echo $zone.$img.$fin; //paramètre de connexion à la base de données $hote = 'localhost'; $utilisateur = 'root'; $mdp = ''; $connexion = mysql_connect ($hote, $utilisateur, $mdp); $bdd = 'ile'; //connexion à la base de donnée mysql_select_db($bdd, $connexion); //ajout des ID des cases dans la table casesmap $idcases = "INSERT INTO casesmap (`ID`) VALUES ('$num')"; $query = mysql_query($idcases, $connexion); } } function casesRiviere() { //paramètre de connexion à la base de données $hote = 'localhost'; $utilisateur = 'root'; $mdp = ''; $connexion = mysql_connect ($hote, $utilisateur, $mdp); $bdd = 'ile'; //connexion à la base de donnée mysql_select_db($bdd, $connexion); while ($i==1) { $rand = rand(0,143); if($rand == 0 || $rand == 1 || $rand == 2 || $rand == 3 || $rand == 4 || $rand == 5 || $rand == 6 || $rand == 7 || $rand == 8 || $rand == 9 || $rand == 10 || $rand == 11 || $rand == 132 || $rand == 133 || $rand == 134 || $rand == 135 || $rand == 136 || $rand == 137 || $rand == 138 || $rand == 139 || $rand == 140 || $rand == 141 || $rand == 142 || $rand == 143) { $riveH = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'"; $query3 = mysql_query($riveH, $connexion); $i=0; } elseif($rand == 12 || $rand == 24 || $rand == 36 || $rand == 48 || $rand == 60 || $rand == 72 || $rand == 84 || $rand == 96 || $rand == 108 || $rand == 120 || $rand == 23 || $rand == 35 || $rand == 47 || $rand == 59 || $rand == 71 || $rand == 83 || $rand == 95 || $rand == 107 || $rand == 119 || $rand == 131) { $riveD = "INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'"; $query4 = mysql_query($riveD, $connexion); $i=0; } else { $rand = rand(0,143); } } } casesRiviere(); ajoutCases(); ?>
Voilà.
Salut alors bon....
Pour commencer oui explode permet de construire un tableau.
Dans le
le '|' permet de determiner a quel endroit sera coupé ta chaine $chaine :
Pour en revenir a ton probleme je l'ai déjà eu et j'ai mis un moment a trouver d'où cela venait !
En fait dans mon cas c'était la définition des champs de ma table qui était fausse.
En gros je fesait :
Alors que mon champs text était de type varchar(4)
PAr conséquent il ne m'introduisait pas ce que je lui demandais !
CA le fait aussi si tu fait :
Dans le VALUES il faut mettre le nombre de champs que ta table contient ! ;)
Pour commencer oui explode permet de construire un tableau.
Dans le
$a1 = explode( '|', $chaine );
le '|' permet de determiner a quel endroit sera coupé ta chaine $chaine :
$a1 = array( [0] =>0, [1] =>1, .... [12] => 132, [13] => 133, ...);
Pour en revenir a ton probleme je l'ai déjà eu et j'ai mis un moment a trouver d'où cela venait !
En fait dans mon cas c'était la définition des champs de ma table qui était fausse.
En gros je fesait :
INSERT INTO table_a ('id', 'text', 'indice', 'sexe')VALUES ('', 'je m'appelle francky', '0', 'masculin');
Alors que mon champs text était de type varchar(4)
PAr conséquent il ne m'introduisait pas ce que je lui demandais !
CA le fait aussi si tu fait :
INSERT INTO table_a ('id', 'text', 'indice', 'sexe')VALUES ('', 'je m'appelle francky', '0');
Dans le VALUES il faut mettre le nombre de champs que ta table contient ! ;)
Ok ok, exacte. Je vais essayer en ajoutant NULL pour mon champ ID.
Le type de mon champ image est TINYTEXT, cela me semble correcte non ?
Le type de mon champ image est TINYTEXT, cela me semble correcte non ?
Après une tentative avec le code suivant, rien n'a changé .... bizarre tout de même :
while ($i==1) { $rand = rand(0,143); $a1 = explode( '|', '0|1|2|3|4|5|6|7|8|9|10|11|132|133|134|135|136|137|138|139|140|141|142|143' ); $a2 = explode( '|', '12|24|36|48|60|72|84|96|108|120|23|35|47|59|71|83|95|107|119|131' ); if(in_array( $rand, $a1 )) { $riveH = "INSERT INTO casesmap (`ID`, `image`) VALUES (NULL, '<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'"; $query3 = mysql_query($riveH, $connexion); $i=0; } elseif(in_array( $rand, $a2 )) { $riveD = "INSERT INTO casesmap (`ID`, `image`) VALUES (NULL, '<img src=\"../images/riveD.png\" alt=\"\" />') WHERE ID = '".$rand."'"; $query4 = mysql_query($riveD, $connexion); $i=0; } else { $rand = rand(0,143); } }
Voilà la structure de ma table. Je ne copie pas le contenu car ce sont des entrées qui vont de 1 à 143 :
Base de données ile
Structure de la table casesmap
Champ Type Null Défaut
ID tinyint(3) Oui NULL
image tinytext Oui NULL
Contenu de la table casesmap
0
1
2
3
...
Je vais essayer ta fonction pour l'introduction de code HTML et je te fais part de mes découvertes. Merci.
Base de données ile
Structure de la table casesmap
Champ Type Null Défaut
ID tinyint(3) Oui NULL
image tinytext Oui NULL
Contenu de la table casesmap
0
1
2
3
...
Je vais essayer ta fonction pour l'introduction de code HTML et je te fais part de mes découvertes. Merci.
ah....
je crois avoir vu ton erreur....
si tu utilise :
ca veut dire que ton entrée existe déjà...
A cemoment la ce n'est pas un "INSERT INTO" qui faudrait faire mais un "UPDATE"
essai ca :
ajuste le pour l'autre requete SQL ! ;)
je crois avoir vu ton erreur....
si tu utilise :
INSERT INTO casesmap (`ID`, `image`) VALUES (NULL, '<img src=\"../images/riveH.png\" alt=\"\" />') WHERE ID = '".$rand."'";
ca veut dire que ton entrée existe déjà...
A cemoment la ce n'est pas un "INSERT INTO" qui faudrait faire mais un "UPDATE"
essai ca :
UPDATE casesmap SET image = '<img src=\"../images/riveH.png\" alt=\"\" />' WHERE ID = '".$rand."'";
ajuste le pour l'autre requete SQL ! ;)
Re,
Oui, 'balou01' a raison, ta gestion du champs 'ID' parait un peu flou !.... Pourquoi la définir systématiquement à NULL !???
Car faire INSERT INTO .... WHERE ... en fait, n'a aucun sens....
Donc soit tu veux créer un nouvel objet 'casesmap' en base de données dans ce cas tu fais :
INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />');
Soit tu veux le mettre à jour (parce qu'il existe déjà)
UPDATE casesmap SET `image`= '<img src=\"../images/riveH.png\" alt=\"\" />' WHERE `ID` = '".$rand."'";
Dans le cas d'une insertion, mieux vaut déclarer ton champ 'ID' non null, Primary KEY, et AUTOINCREMENT...
Amicalement,
S@M...
http://kryoportail.ath.cx
Oui, 'balou01' a raison, ta gestion du champs 'ID' parait un peu flou !.... Pourquoi la définir systématiquement à NULL !???
Car faire INSERT INTO .... WHERE ... en fait, n'a aucun sens....
Donc soit tu veux créer un nouvel objet 'casesmap' en base de données dans ce cas tu fais :
INSERT INTO casesmap (`image`) VALUES ('<img src=\"../images/riveH.png\" alt=\"\" />');
Soit tu veux le mettre à jour (parce qu'il existe déjà)
UPDATE casesmap SET `image`= '<img src=\"../images/riveH.png\" alt=\"\" />' WHERE `ID` = '".$rand."'";
Dans le cas d'une insertion, mieux vaut déclarer ton champ 'ID' non null, Primary KEY, et AUTOINCREMENT...
Amicalement,
S@M...
http://kryoportail.ath.cx
Désolé je n'ai pas eu le temps de me pencher sur vos réponse, mais quand je l'aurais, je vous tiendrais au courant c'est promis. Merci en tout cas pour votre générosité et votre aide.
Bonne journée
Bonne journée
dans tous les langages de programmation qui me sont familiers, rand ou son equivallent retourne un nombre reel entre 2 limites. ne connaissant pas votre langage de programmation, essayez de voir de ce cote.
Ok e, fait je stocke le code HTML dans une varialbe et après j'insère la variable dans ma table.
J'ai testé avec un autre programme, ça fonctionne donc je pense que ca devrait fonctionné avec ce programme aussi.
Comme je n'ai pas le temps de m'en occuper (trop de boulot !) j'essaierais plus tard, mais à mon avis la solution est là.
Merci à tous.
PS : problème résolu.
J'ai testé avec un autre programme, ça fonctionne donc je pense que ca devrait fonctionné avec ce programme aussi.
Comme je n'ai pas le temps de m'en occuper (trop de boulot !) j'essaierais plus tard, mais à mon avis la solution est là.
Merci à tous.
PS : problème résolu.