Ich versuche, Werte in die Inhaltstabelle einzufügen. Es funktioniert gut, wenn ich in VALUES keine Variable PHP habe. Wenn ich die Variable $type
in VALUES stecke, funktioniert das nicht. Was mache ich falsch?
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");
Die Regeln zum Hinzufügen von Zeichenfolgen zu einer Abfrage sind einfach und einfach:
mysql_real_escape_string()
Ihr Code wird also
$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
Wenn Sie die Variable jedoch in einem anderen Teil einer Abfrage hinzufügen, ändern sich die Regeln.
Zum Beispiel:
$limit = intval($_GET['limit']); //casting to int type!
$query = "SELECT * FROM table LIMIT $limit";
Zum Beispiel:
if ($_GET['sortorder'] == 'name') {
$sortorder = 'name';
} else {
$sortorder = 'id';
}
$query = "SELECT * FROM table ORDER BY $sortorder";
Um alles vereinfacht zu machen mit garantierter Sicherheit, müssen Sie eine Art Platzhaltersystem verwenden, bei dem die Variable nicht direkt, sondern über einen als Platzhalter bezeichneten Proxy in eine Abfrage geht.
So wird Ihr Abfrageaufruf in etwa wie folgt:
$type = 'testing';
$reporter = "John O'Hara";
pquery("INSERT INTO contents (type, reporter, description) VALUES(?s, ?s, ?s)",
$type, $reporter,'whatever');
Es gibt absolut keinen Grund, sich um all diese Dinge zu kümmern.
Für die begrenzte Anzahl von Platzhaltern können Sie PDO verwenden. Für den praktischen Einsatz benötigen Sie jedoch ein erweitertes Set, das nur von wenigen Bibliotheken angeboten wird. Eine davon ist SafeMysql .
Solange es sich um einen String handelt, müssen Sie ihn in Anführungszeichen setzen
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
Und ja, wie Dani empfohlen hat: Sie sollten jeden String, den Sie mit mysql_real_escape_string()
in die Abfrage eingeben
Das ist die einfache Antwort:
$query="SELECT * FROM CountryInfo WHERE Name = '".$name."'";
und Sie definieren $name
, was immer Sie möchten.
Und ein anderer Weg, der komplexe Weg, ist so:
$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'] .
"'";
Versuche dies:
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
Sie müssen '$type'
nicht nur $ type eingeben
Der Text in $ type wird direkt in die Einfügungszeichenfolge eingefügt. MySQL erhält daher Folgendes:
... VALUES(testing, 'john', 'whatever')
Beachten Sie, dass es keine Anführungszeichen um das Testen gibt. Sie müssen diese wie folgt einfügen:
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
Ich empfehle Ihnen auch, sich mit SQL Injection vertraut zu machen, da diese Art der Parameterübergabe zu Hackerversuchen neigt, wenn Sie die verwendeten Daten nicht bereinigen:
Wenn die Variablen Benutzereingaben oder andere Daten enthalten, denen Sie nicht vertrauen können, stellen Sie sicher, dass die Daten mit einem Escape-Zeichen versehen werden. So was:
$query = sprintf("INSERT INTO contents (type) VALUES ('%s')", mysql_real_escape_string($type));
$result = mysql_query($query);
Hier
$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
Ich weiß, es gab ein paar Antworten auf diese Frage, aber ich dachte, ich würde hinzufügen, dass ich, wenn Sie der folgenden Syntax folgen, nie wieder ein Problem mit dem Fehler hatte. Keine Frage, welche Tabelle Sie verwenden und welche Spalten Sie anhängen.
$query = "INSERT INTO contents (type, reporter, description)
VALUES('".$type."', '".$reporter."', '"$whatever."')";
um die SQL-Injection zu vermeiden, wird die Einfügeanweisung mit be
$type = 'testing';
$stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $type , 'john', 'whatever');
$stmt->execute();
$stmt->close();
Die beste Option sind vorbereitete Anweisungen. Mit Anführungszeichen und Fluchten herumzumachen, ist anfangs schwieriger und schwer zu warten. Früher oder später werden Sie versehentlich vergessen, etwas zu zitieren oder der gleichen Zeichenfolge zweimal zu entkommen oder so etwas durcheinander zu bringen. Es könnte Jahre dauern, bis Sie diese Art von Fehlern finden.
Sie müssen die Variable in einfache oder doppelte Anführungszeichen setzen, dann Klammern und dann den Variablennamen (Beispiel: $ abc).
Beispiel:
SELECT * FROM log WHERE id = '{$id}';