web-dev-qa-db-fra.com

Comment inclure un PHP variable dans une instruction d'insertion MySQL

J'essaie d'insérer des valeurs dans la table de contenu. Cela fonctionne bien si je n’ai pas de variable PHP dans VALUES. Lorsque je mets la variable $type dans VALUES, cela ne fonctionne pas. Qu'est-ce que je fais mal?

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");
43
Pinkie

Les règles relatives à l'ajout de chaînes dans une requête sont claires et simples:

  1. La chaîne doit être entre guillemets.
  2. Par conséquent, ces guillemets doivent être échappés dans les données, ainsi que certains autres caractères, à l'aide de mysql_real_escape_string().

Alors, votre code devient

$type     = 'testing';
$type     = mysql_real_escape_string($type);
$reporter = "John O'Hara";
$reporter = mysql_real_escape_string($reporter);

$query    = "INSERT INTO contents (type, reporter, description) 
             VALUES('$type', '$reporter', 'whatever')";
mysql_query($query) or trigger_error(mysql_error()." in ".$query);
// note that when running mysql_query you have to always check for errors

Mais si vous allez ajouter la variable dans une autre partie d'une requête, les règles changent. 

  • Pour ajouter un nombre, vous devez le convertir explicitement en son type. 

Par exemple:

$limit = intval($_GET['limit']); //casting to int type!
$query = "SELECT * FROM table LIMIT $limit";
  • Pour ajouter un identifiant, il est préférable de le choisir dans une sorte de liste blanche composée de valeurs codées en dur

Par exemple:

if ($_GET['sortorder'] == 'name') {
  $sortorder = 'name';
} else {
  $sortorder = 'id';
}
$query = "SELECT * FROM table ORDER BY $sortorder";

Pour simplifier tout tout en garantissant la sécurité, il faut utiliser un système placeholder dans lequel la variable entre dans une requête non pas directement, mais via un proxy appelé espace réservé.

Ainsi, votre appel de requête devient quelque chose comme ceci:

$type     = 'testing';
$reporter = "John O'Hara";
pquery("INSERT INTO contents (type, reporter, description) VALUES(?s, ?s, ?s)",
        $type, $reporter,'whatever');

Et il n'y aura absolument aucun besoin de s'inquiéter de toutes ces questions.

Vous pouvez utiliser PDO pour l’ensemble limité d’espaces réservés. Bien que pour une utilisation réelle, vous aurez besoin d'un ensemble étendu proposé par quelques bibliothèques, dont/ SafeMysql .

75
Your Common Sense

Tant que c'est une chaîne - vous devez la mettre entre guillemets

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

Et oui, comme l'a conseillé Dani: vous devez nettoyer chaque chaîne que vous avez mise dans la requête avec mysql_real_escape_string()

8
zerkms

C'est la réponse facile:

$query="SELECT * FROM CountryInfo WHERE Name = '".$name."'";

et vous définissez $name comme vous voulez.
Et une autre manière, la manière complexe, est comme ça:

$query = " SELECT '" . $GLOBALS['Name'] . "' .* " .
         " FROM CountryInfo " .
         " INNER JOIN District " .
         " ON District.CountryInfoId = CountryInfo.CountryInfoId " .
         " INNER JOIN City " .
         " ON City.DistrictId = District.DistrictId " .
         " INNER JOIN '" . $GLOBALS['Name'] . "' " .
         " ON '" . $GLOBALS['Name'] . "'.CityId = City.CityId " .
         " WHERE CountryInfo.Name = '" . $GLOBALS['CountryName'] .
         "'";
4
Baloomba

Essaye ça:

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

Vous devez mettre '$type' pas seulement $ type

3
Chris Ghenea

Le texte à l'intérieur de $ type est substitué directement dans la chaîne d'insertion, donc MySQL obtient ceci:

... VALUES(testing, 'john', 'whatever')

Notez qu'il n'y a pas de guillemets sur les tests, vous devez les mettre comme suit:

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

Je vous recommande également de lire injection SQL , car ce type de passage de paramètres est sujet aux tentatives de piratage si vous ne désinfectez pas les données utilisées:

3
Spencer Rose

Si les variables contiennent une entrée utilisateur ou d'autres données non fiables, assurez-vous d'échapper aux données. Comme ça:

$query = sprintf("INSERT INTO contents (type) VALUES ('%s')", mysql_real_escape_string($type));
$result = mysql_query($query);
1
Harri

Ici

$type='testing' //it's string

mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");//at that time u can use it(for string)


$type=12 //it's integer
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");//at that time u can use $type
1
user962293

Je sais qu'il y a eu quelques réponses à cette question, mais j'ai pensé ajouter que si vous suivez la syntaxe suivante, je n'ai jamais eu de problème avec l'erreur. Aucune question sur la table que vous utilisez et sur les colonnes que vous ajoutez.

$query    = "INSERT INTO contents (type, reporter, description) 
         VALUES('".$type."', '".$reporter."', '"$whatever."')";
1
villeguy

pour éviter l'injection SQL de l'instruction insert avec be

$type = 'testing';

$stmt = $con->prepare("INSERT INTO   contents (type, reporter, description) VALUES (?, ?, ?)");
         $stmt->bind_param("sss", $type , 'john', 'whatever');
         $stmt->execute();
    $stmt->close();
0
Stefan

La meilleure option est les instructions préparées. S'amuser avec des citations et des fuites est un travail plus difficile au début et difficile à maintenir. Tôt ou tard, vous finirez par oublier accidentellement de citer quelque chose, vous échapperez deux fois de la même chaîne ou vous vous trompez. Peut-être des années avant de trouver ce type de bugs.

http://php.net/manual/en/pdo.prepared-statements.php

0
Tel

Vous devez écrire la variable entre guillemets simples ou doubles, puis entre accolades, puis le nom de la variable (exemple: $ abc) à l'intérieur.

Exemple:

SELECT * FROM log WHERE id = '{$id}';
0
Astjan Selimaj