Nasıl bir MySQL veritabanı tırnak içeren bir dize saklamak?

5 Cevap php

Ben aşağıdaki tablo vardır:

$sql = "CREATE TABLE received_queries
    (
     sender_screen_name varchar(50),
     text varchar(150)
    )";

Ben tablodaki değerleri depolamak için aşağıdaki SQL deyimini kullanın

$sql = "INSERT INTO received_queries VALUES ('$sender_screen_name', '$text')";

Şimdi 'metin' olarak aşağıdaki dize depolamak çalışıyorum.

One more #haiku: Cotton wool in mind; feeling like a sleep won't cure; I need some coffee.

ve ben aşağıdaki hata iletisini alabilirsiniz:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't cure; I need some coffee.')' at line 1

Bu oldukça yaygın bir sorun olması gerekir düşünüyorum. Bunu nasıl çözerim?

5 Cevap

Ben oldukça kaçan daha (mysqli'nin veya PDO ile) hazırlanmış deyimleri kullanarak öneririm.

Please note that putting together an SQL query like that bears potential security risks.

Bunu yapmak için daha iyi bir yolu prepared statements kullanmaktır. Ne bu temelde anlamı gerçek değerler (örneğin $sender_screen_name gibi $text) gitmek istiyorum sizin SQL içine belirli tutucuları koyuyor.

Ben 'net arandı ve bu, ben genelde bu dilde şey iyi PHP programı yok olmayabilir eğer nasıl hazırlanmış deyimleri üzgün (PHP yapılabilir gösteren, aşağıdaki kod parçacığını ile geldi - ama o) makul bir başlangıç ​​noktası olarak hizmet verebilir sanırım:

$dbSelect = $objDb->prepare("INSERT INTO received_queries VALUES (:ssn, :text");

$dbSelect->bindParam('ssn', $sender_screen_name);
$dbSelect->bindParam('text', $text);

Hazırlanmış bir deyimi olarak sorgu yürütülerek, siz dizeleri kendinizi kaçan hakkında endişelenmenize gerek yoktur. PHP ve RDBMS otomatik olarak sizin için idare edecek.

Sen kullanabilirsiniz mysql_real_escape_string

Sen tek tırnak kaçmak \'. manual bakın.

One more #haiku: Cotton wool in mind; feeling like a sleep won\'t cure; I need some coffee.

Kullanıcı girişi ile bir dize birleştirerek SQL inşa asla. Bu, SQL enjeksiyon saldırıları için uygulamayı açar (Sadece birisi girdiğinde ne olur hayal '); delete from received_queries; olarak $text).

Bu nedenle, her zaman tutucular ve değerleri ile daha sonra bir dizi ile bir dize geçmesine izin verir (PHP için {[) (0]} gibi) DB çerçeve kullanmalısınız. Framework sonra değerleri herhangi bir zarar yapamaz emin olacaktır.