2016-07-08 9 views
0

Ich übergebe Formularwerte in eine Datenbank mit PHP, aber ich bin ein Problem, wenn Benutzer Sonderzeichen wie ein Apostroph eingeben. Wenn beispielsweise jemand Bill's Pet Supply in Organisation eingibt, wird ein SQL-Fehler angezeigt.Einfügen von Sonderzeichen in SQL-Datenbank aus Formular

Hier ist mein Code:

$conn = new mysqli($servername, $username, $password, $dbname); 

if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

if(isset($_POST['submit'])) { 
    $firstname = $_POST['firstname']; 
    $lastname = $_POST['lastname']; 
    $email = $_POST['email']; 
    $organization = $_POST['organization']; 

    $sql = $conn->prepare("INSERT INTO submissions VALUES (:firstname, :lastname, :email, :organization)"); 

    $sql->bindValue(':firstname', $firstname); 
    $sql->bindValue(':lastname', $lastname); 
    $sql->bindValue(':email', $email); 
    $sql->bindValue(':organization', $organization); 

    $sql->execute(); 
} 

$conn->close(); 

Wie kann ich diesen Code ändern, so dass Apostrophe und andere Sonderzeichen werden unterstützt?

+1

Verwenden Sie mysqli oder PDO und verwenden Sie die Parameterbindung. – aynber

+0

Sehen Sie, wenn diese Info hilft: [http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php](http://stackoverflow.com/questions/60174/how -can-i-prevent-sql-injection-in-php) –

+1

Es gibt zwei Interface-Bibliotheken: mysqli und PDO. Und es sieht so aus, als würden Sie PDO-unterstützte Funktionen verwenden, die in mysqli nicht unterstützt werden. Ich glaube nicht, dass mysqli benannte Platzhalter wie PDO unterstützt, z. ** ': Vorname' **. Verwenden Sie bei mysqli den positionellen Platzhalter ** '?' **. PDO hat eine ** bindValue ** -Funktion. mysqli verwendet die Funktion "bind_param" **. Siehe das Beispiel in meiner aktualisierten Antwort. – spencer7593

Antwort

1

Verwenden Sie vorbereitete Anweisungen mit Bindung Platzhalter. Sowohl PDO als auch MySQL unterstützen diese.

Ihr SQL-Text würde wie folgt aussehen:

$sql = "INSERT INTO submissions (firstname, lastname, email, organization) 
VALUES (?, ?, ?, ?)"; 

Wenn Sie mit mysqli

mysqli_prepare

myslqi_bind_param

myslqi_execute

$sth = $mysqli->prepare($sql); 
if(!$sth) { 
    // handle error 
} 
$sth->bind_param("ssss", $firstname, $lastname, $email, $organization); 
if($res = $sth->execute()) { 
    // process resultset 
} 

Ähnliche Funktionen in PDO verfügbar, aber Sie können "bind value" anstelle von "bind param" verwenden.


Wenn es aus irgendeinem Grund ist Sie vorbereitete Anweisungen nicht mit bind Platzhalter verwenden können, dann auf ein Minimum, werden Sie müssen richtig alle potenziell unsichere Werte, die in der SQL-Text entkommen.

Wenn Sie mysqli verwenden, dann den SQL-Text zu erzeugen wie folgt aussehen würde:

$sql = "INSERT INTO submissions (firstname, lastname, email, organization) 
VALUES ('" . $mysqli->real_escape_string($firstname) 
    . "', '" . $mysqli->real_escape_string($lastname) 
    . "', '" . $mysqli->real_escape_string($email) 
    . "', '" . $mysqli->real_escape_string($organization) 
    . "')"; 

Aber tun das nicht. Verwenden Sie eine vorbereitete Anweisung mit Bindung Platzhalter.

+0

Danke, das ist wirklich hilfreich. Ich habe meinen Code mit mysqli prepared Statements aktualisiert, aber jetzt bekomme ich einen 500 Fehler, wenn ich das Formular absende. Können Sie einen Blick darauf werfen und lassen Sie mich wissen, wenn Sie irgendwelche Probleme sehen? – user13286

+0

Macht nichts, benutzte deine aktualisierte Antwort und es funktioniert jetzt großartig, danke nochmal! – user13286

Verwandte Themen