Concaténation dans une requête SQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Concaténation dans une requête SQL

Re: Concaténation dans une requête SQL

par Benamour Jr » 30 mars 2010, 12:07

ouep, alors donc tout d'abord l'affichage quand on arrive pour la première fois :

(http://e-storia.info/01.jpg)
Image

puis une fois qu'on a spécifié le nombre de liaisons :

(http://e-storia.info/02.jpg)
Image

Re: Concaténation dans une requête SQL

par stealth35 » 30 mars 2010, 11:59

ta une capture d'écran pour voir mieux :wink:

Re: Concaténation dans une requête SQL

par Benamour Jr » 30 mars 2010, 11:55

Merci pour ton aide ! Mais n'est-ce pas dangereux de laisser la variable $table directement dans la requete préparée ? Moi je pensais que pour que ca soit sécurisé, il fallait obligatoirement utiliser les marqueurs ?

Sinon je sais pas trop pourquoi je n'ai pas utilisé $_POST['lien'][0], faire comme j'ai fait me semblait plus facile, je te montre mon code concernant le formulaire si tu veux. Ca pose un problème de laisser tel quel ou faut que je change ça ?
<?php
<form method="post">
	<p>Adresse internet : <input type='text' name='url' size='50' <?php if (!empty($_POST['url'])) { echo 'value=' . htmlspecialchars($_POST['url']); } else { echo 'value=' . htmlspecialchars($url); } ?> /></p>
	<?php include 'verif_article_presse_date.php' ?>
	<?php include 'verif_article_presse_presse.php' ?>
	<p>Titre : <input type='text' name='titre' maxlength='100' size='50' <?php if (!empty($_POST['titre'])) { echo 'value="' . htmlspecialchars($_POST['titre']) . '"'; } ?> /></p>
	<?php
	if (isset($_POST['lien']))
	{
		echo "<p>Nombre de liaisons : <input type='text' name='lien' size='2' value=" . $_POST['lien'] . " /></p>";
		
		for ($nombre_de_lignes = 1; $nombre_de_lignes <= $_POST['lien']; $nombre_de_lignes++)
		{
			echo '<p>Lier l\'article de presse à un/une <select name="lien' . $nombre_de_lignes . '"><option value="article_presse_dossier">dossier</option><option value="article_presse_individu">individu</option><option value="article_presse_organisation">organisation</option><option value="article_presse_parti_politique">parti politique</option><option value="article_presse_pays">pays</option><option value="article_presse_relation">relation</option></select> dont l\'id est <input type="text" name="id' . $nombre_de_lignes . '" size="3" /></p>';
		}
	}
	else
	{
		echo "<p>Nombre de liaisons : <input type='text' name='lien' size='2' /></p>";
	}
	?>
	<input type="submit" value="Valider" />
</form>
?>

Re: Concaténation dans une requête SQL

par stealth35 » 30 mars 2010, 11:32

ton code devrais ressembler a ca
set_exception_handler('printf'); //ca c'est juste pour pas faire tout les try...catch	
for ($nb_lignes = 1; $nb_lignes <= $_POST['lien']; $nb_lignes++)
{
	$req_link = $bdd->prepare("INSERT INTO ".$table." (id_article_presse, id2) VALUES(:id_article_presse, :id2)");
	$table 	= $_POST['lien' . $nb_lignes];
	$id2 	= $_POST['id' 	. $nb_lignes];
		
	$req_link->execute(array('id_article_presse' => $_GET['id'], 'id2' => $id2));
}
j'ai des doutes sur les coup des $_POST['lien' . $nb_lignes] , pourquoi t'as pas utilisé les liste directement ? $_POST['lien'][0]

je comprend pas non plus le coup des tables ?

Re: Concaténation dans une requête SQL

par stealth35 » 30 mars 2010, 11:26

oula tu mélanges plusieurs pratique

avec PDO (très bien de l'utilisé, je t'encourage dans cette voie)
par contre, pour la requête préparer c'est pas très optimiser dans ton cas
pour le coup du or die (deja c'est "or exit"), ca marche pas comme ca avec PDO ca marche par exception (try...catch)
pour "mysql_real_escape_string" ca marche que avec l'extension mysql (donc pas avec PDO) et ca sert a rien puisque tu est déjà en requête préparer

la suite bientôt :wink:

Re: Concaténation dans une requête SQL

par Benamour Jr » 30 mars 2010, 11:22

en effet, j'ai ajouté un petit or die(print_r($bdd->errorInfo(), true)) et j'ai directement vu d'où venait mon erreur (le nom de mon champ c'est id_article_presse et non id_article... xD).

Par contre maintenant j'ai un autre problème :s j'ai utilisé les requêtes préparés mais apparemment je ne peux pas les utiliser pour la variable contenant le nom de ma table, ca donne donc ceci :
<?php
for ($nb_lignes = 1; $nb_lignes <= $_POST['lien']; $nb_lignes++)
{
	$table = $_POST['lien' . $nb_lignes . ''];
	$id2 = $_POST['id' . $nb_lignes . ''];
	$req_link = $bdd->prepare("INSERT INTO ".$table." (id_article_presse, id2) VALUES(:id_article_presse, :id2)") or die(print_r($bdd->errorInfo(), true));
	$req_link->execute(array('id_article_presse' => $_GET['id'], 'id2' => $id2)) or die(print_r($bdd->errorInfo(), true));
	$req_link->closeCursor();
}
?>
Le code fonctionne mais ca ne me plait pas de laisser la variable table directement dans la requête. Le problème c'est que si je remplace ".$table." par :table et que j'ajoute 'table' => $table à l'execute, ca ne marche pas...

J'ai aussi essayer de rajouter la ligne $table = mysql_real_escape_string($table); mais dans ce cas mon code ne fonctionne plus non plus...

Comment dois-je faire pour sécuriser cette variable ?

Re: Concaténation dans une requête SQL

par devlop78 » 30 mars 2010, 02:02

AB tu m'as pris de court !

Re: Concaténation dans une requête SQL

par devlop78 » 30 mars 2010, 02:02

1) Verifie que tes champs SQL sont bien des integer, des string, ou quelque chose de compatible
2) Tape ta requête (celle que tu as copiée) dans phpmyadmin pour voir sa réaction (il se peut que le fait d'oublier le point virgule à la fin soit en cause, ou que tu aies oublié des quotes, des espaces, etc et lui te le diras).

Re: Concaténation dans une requête SQL

par AB » 30 mars 2010, 01:59

Fais aussi afficher le message d'erreur de l'exécution de la requête pour y voir encore plus clair :wink:

Concaténation dans une requête SQL

par Benamour Jr » 30 mars 2010, 01:25

Bonsoir !

J'essaye depuis quelques temps de faire fonctionner une requête SQL... en vain :s
Dans mon code je récupère deux types de variables provenant d'un formulaire (des $_POST['lien1'], $_POST['lien2'], $_POST['lien3'],... et ainsi de suite ainsi que des $_POST['id1'], $_POST['id2'],...) que j'utilise dans une requête SQL que voici :
<?php
for ($nb_lignes = 1; $nb_lignes <= $_POST['nb_liens']; $nb_lignes++)
{
	$table = $_POST['lien' . $nb_lignes . ''];
	$id2 = $_POST['id' . $nb_lignes . ''];
	$requete = "INSERT INTO ".$table."(id_article, id2) VALUES('".$_GET['id']."', '".$id2."')";
	echo $requete . '<br />'; // que j'ai inséré pour y voir plus clair dans mon erreur
	$bdd->exec($requete);
}
?>
l'echo $requete me retourne ceci quand $_POST['nb_liens'] vaut par exemple 3 :

INSERT INTO article_presse_dossier(id_article, id2) VALUES('47', '5')
INSERT INTO article_presse_individu(id_article, id2) VALUES('47', '2')
INSERT INTO article_presse_dossier(id_article, id2) VALUES('47', '2')

Ce qui me semble tout à fait correct, puis que j'ai les champs 'id_article' et 'id2' dans les deux tables concernées. Seulement voila, rien n'est ajouté dans mes tables... ca ne fonctionne pas :s

Si quelqu'un pouvait m'aider à trouver mon erreur je lui en serais vraiment très reconnaissant, merci ! :)