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')");
Les règles relatives à l'ajout de chaînes dans une requête sont claires et simples:
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.
Par exemple:
$limit = intval($_GET['limit']); //casting to int type!
$query = "SELECT * FROM table LIMIT $limit";
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 .
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()
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'] .
"'";
Essaye ça:
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
Vous devez mettre '$type'
pas seulement $ type
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:
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);
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
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."')";
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();
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.
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}';