it-swarm.com.de

Wie füge ich ein PHP Variable in einer MySQL-Einfügeanweisung

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')");
43
Pinkie

Die Regeln zum Hinzufügen von Zeichenfolgen zu einer Abfrage sind einfach und einfach:

  1. Die Zeichenfolge sollte in Anführungszeichen stehen.
  2. Daher sollten diese Anführungszeichen in den Daten sowie in einigen anderen Zeichen mit 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. 

  • Um eine Nummer hinzuzufügen, müssen Sie sie explizit in ihren Typ umwandeln. 

Zum Beispiel:

$limit = intval($_GET['limit']); //casting to int type!
$query = "SELECT * FROM table LIMIT $limit";
  • Um einen Bezeichner hinzuzufügen, ist es besser, ihn aus einer weißen Liste zu wählen, die aus fest codierten Werten besteht

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 .

75

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

8
zerkms

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'] .
         "'";
4
Baloomba

Versuche dies:

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

Sie müssen '$type' nicht nur $ type eingeben

3
Chris Ghenea

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:

3
Spencer Rose

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);
1
Harri

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
1
user962293

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."')";
1
villeguy

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();
0
Stefan

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.

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

0
Tel

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}';
0
Astjan Selimaj