[PHP] - Les " et les ' face aux requêtes... - Il y a encore du taf finalement ^^

$query = "INSERT INTO clients (id,Infos) VALUES($_POST[id], $_POST[Infos])"
mysql_query($query);

J’ai essayé htmlspecialchars() addslashes() et autres, et rien à faire : s’il y a des " ou ’ dans Infos (ou autre d’ailleurs) la requête ne fonctionne pas :frowning:

http://www.nexen.net/docs/php/annotee/func…cape-string.php

Sinon évite de mettre tes variables directement entre les ""

les VALUES doivent être entourés de ’

$query = “INSERT INTO clients (id,Infos) VALUES(’$_POST[id]’, ‘$_POST[Infos]’)”;

(en plus tu ferme 2 fois la parenthèse je sais pas pourquoi

un petit conseil, quand j’ai une erreur je fait

echo $query;

là c’est bien plus facile à voir où est la faute.

Raaa ca marche ^^ J’avais foiré une ) quand j’ai essayé ta fonction :wink:

Tu veux dire quoi par mettre tes variables directement entre les ""

EDIT : NeqO > en fait je retape depuis mon portable les requêtes, donc je les allège de ce qui n’est pas utile… et donc ca m’arrive de me gourer en recopiant :smiley:

“INSERT INTO clients (id,Infos) VALUES(’$_POST[id]’, ‘$_POST[Infos]’)”;

=>

“INSERT INTO clients (id,Infos) VALUES(’”.$_POST[id]."’, ‘".$_POST[Infos]."’)";

Ca c est totallement faux.
Il faut savoir que quand tu ecris une requette tu ecris du text donc si tu mets des varible super globle comme $_POST eh bien il faut la concaténner comme pour un echo.
Donc ta requette vas etre :
‘INSERT INTO clients (id,Infos) VALUES(’".$_POST[id]."’, ‘".$_POST[Infos]."’)’;
Pour verifier si ta requette est correctement ecrie fait echo de ta requette sinon tu peux rajouter un die(), comme ca[quote=""]
$sql =‘INSERT INTO clients (id,Infos) VALUES(’".$_POST[id]."’, ‘".$_POST[Infos]."’)’;
$resul = (mysql_query($sql) || die(“Erreur de requette <br>”.$sql));
[/quote]
Comme ca si ta requette n est pas juste elle 'affiche

Pas pigé le dernier message, passons.

Ta requête serait mieux comme ça :


$q = 'INSERT INTO clients (id,Infos) VALUES(' .
               intval($_POST['id']) .
               "'" . mysql_real_escape_string($_POST['Infos']) . "')";

philneo> C’est requête, pas requette (et ni requéquette!)

Non, je me complique pas la vie. Je m’assure que la requête est sûre. Parce que bon, ton petit test de requête juste ou non, ne me protége pas des injections de code SQL :slight_smile:

oui c est sur

Merci pour ces informations. niveau sécurité j’y connais vraiment rien, d’autant que ca se passe uniquement sur mon portable :slight_smile: je débute et j’apprends sur le tas donc forcément c’est loin d’être clean tout ca.

Par chance ( ? ) le bazar sera recodé ensuite ^^ Mais bon c’est utile pour moi d’avoir ce genre d’informations.

Donc tu regardes si c’est un intégral le ID si je capte bien ? T’as une fonction similaire pour les float ? Car je dois additionner des montants et j’ai remarqué que si on mettais 10,5 et ben ca sauvait 10.00 dans la BDD, alors que 10.5 fonctionne bien.

J’ai fait un str_replace( “,” , “.” , “$chaine”); mais je sais pas si c’est la méthode efficace / propre pour procéder.

EDIT : il y a d’autres tests / astuces obligatoires pour les requêtes SQL ? histoire que je remodifie pas toutes mes requêtes à chaque fois :smiley:

Quelle horreur !
Sans-nom l’a corrigé dans son exemple mais visiblement personne n’y a fait attention:
“Infos” est censé être une chaîne de caractères, donc tu dois la mettre entre guillemets (doubles ou simples, comme tu veux). Sans guillemets, PHP cherche une CONSTANTE nommée Infos. Et si ça marche quand même, c’est parce que PHP est très tolérant là dessus et considère Infos comme la chaîne “Infos” lorsqu’il ne trouve pas de constante nommée Infos.

Changez votre niveau de rapport d’erreurs, vous allez avoir des surprises.
error_reporting(E_ALL);

Vouais j’ai cru comprendre… le truc c’est que je suis grand débutant moi ^^ spa pour raconter ma vie, mais bon j’ai découvert quelques bases en php en faisant du modding sur mon cher tForum… donc forcément j’ai pas une connaissance très formalisée de la chose :slight_smile:

Dino> les réflexes conditionnés :slight_smile:

J’essaie de faire les choses bien, et donc je pose la question : ya pas d’erreur dans cette requête ?

Je voudrais faire une requête SELECt, et basé sur ce que vous avez expliqué la faire vraiment proprement (php STRICT compliant quoi :ane:).

Mais là je rame un peu avec les ', les " et autres.

un petit exemple tout simple ?

$query = 'SELECT idDossier FROM dossiers WHERE idDossier=$_GET[idDossier]";
$requeteID = (mysql_query($query) || die("Erreur de requête<br />".query));
if (mysql_num_rows($requeteID)
{
    while ($data = mysql_fetch_assoc($requeteID))
    {
         echo $data['idDossier'];
    }
}
else
{
    echo 'Pas de données';
}
?>

Il faut comprendre la signification des ’ et " dans un premier temps.

Les ’ et " délimitent une chaîne de caractère, la seule différence c’est que les variables comprises entre “” seront remplacées par leur valeur. Les ‘’ ne subissent aucun traitement spécial.
De plus si tu ouvre un ’ ou " il faut forcément que tu le referme à la fin avec respectivement avec ’ ou "
Les . servent à concaténer des données pour en faire une chaine de caractère.

Exemple :
‘toto’.“tutu” => tototutu
ou encore
$toto = ‘lala’;
‘tutu’.$toto => tutulala
‘tutu’."$toto" => tutulala
‘tutu.’$toto’ => tutu$toto

Si on te dit de sortir des variables de tes chianes de caractères c’est pour quelques petites raisons :
Ca évite un traitement sur toute la chaine pour transformer les variables en les valeurs de ces variables, mais surtout pour bien séparer ce qui est du texte de ce qui est du php pour la relecture plus tard.

Pour ton exemple :

$query = ‘SELECT idDossier FROM dossiers WHERE idDossier=’.$_GET[‘idDossier’];

Semble déjà beaucoup mieux
Et même encore mieux :
$query = "SELECT idDossier FROM dossiers WHERE idDossier = ".$_GET[‘idDossier’];

il y a sans-nom qui va venir brailler contre l’hérésie de mysql group qui invente des agent délimitateurs alors qu’il y en a déjà :smiley:

si je capte bien ca donnerait éventuellement :

$query = "SELECT idDossier FROM dossiers WHERE idDossier = “.$_GET[‘idDossier’].” AND “.$_GET[‘idDossier’] > 0”;

?

$query = "SELECT idDossier FROM dossiers WHERE idDossier = “.$_GET[‘idDossier’].” AND “.$_GET[‘idDossier’] > 0”;

tkstkstks

$query = "SELECT idDossier FROM dossiers WHERE idDossier = “.$_GET[‘idDossier’].” AND “.$_GET[‘idDossier’] > 0”;

Ya pas comme un problème à ce niveau ?

“.$_GET[‘idDossier’].” >0"; serait mieux c ca ?

tapay trop vite j’en oublie la moitié… grrrr ^^