2014-01-16 130 views
2

我正在使用PHP驅動程序使用sqlsrv驅動程序連接SQL數據庫。然而,我遇到了一個問題:撇號未插入SQL數據庫

$string = "Home"; 
$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('" .$string. "')"); 
$DBH->execute(); 

這是如何工作的?

$string = "Home's"; 
$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('" .$string. "')"); 
$DBH->execute(); 

但是這不?

SQL數據庫似乎不接受$string變量中的撇號。在過去,我會使用mysql_real_escape_string,但這不是一個選項。

+1

不和不工作的話是沒有人瞭解這裏。找到錯誤。 PDO有一個引用方法http://www.php.net/manual/en/pdo.quote.php –

+1

你正在遭受SQL注入 - 這是[如何解決它](http://stackoverflow.com/questions/ 60174 /如何防止SQL注入在PHP) –

+1

「在過去我會使用'mysql_real_escape_string'但這不是一個選項。」這意味着你知道問題是什麼。使用預準備的語句 –

回答

2

這是因爲您使用的是事先準備好的聲明......但不準備任何輸入,而不只是拍着值到SQL。看着它應該清楚:

前1:

$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('Home')"); 

前2:

$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('Home's')"); 

查看您的報價現在是搞砸了?

正確的方式做,這是實際上可以使用準備好的語句的功能:

$string = "Home's"; 
$DBH->prepare("INSERT INTO table_name (column_name) VALUES (:column_name)"); 
$DBH->bindParam(':column_name', $string); 
$DBH->execute(); 

注意如何你的發言首先與:column_name參數準備接受一個值準備。然後bindParam放入一個值並執行。

現在甚至可以重複使用新值準備:

$string = "Home's Holmes is homing"; 
$DBH->execute(); 
+0

我忘記了PHP的OOP,謝謝你的複習課 – proPhet

-1

我想你需要通過使用雙撇號來逃避撇號。在執行插入操作後,檢查表中的數據,它應該只顯示一個撇號。

$string = "Home''s"; 
$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('" .$string. "')"); 
$DBH->execute(); 

好運...

+0

這不是一個字符串轉義問題,它是一個SQL語句問題。 –

+0

in SQL撇號'需要被轉義..插入人 (First,Last) 值 ('Joe','O''Brien') –

+0

這是靜態查詢可接受的,但我很確定'$ string =「Home的」;「只是一個簡化的測試用例。 SQLSRV庫提供體面的準備語句支持。 –

0

sqlsrv documentation page對如何使用準備好的語句像樣的例子:

$sql = "INSERT INTO table_name (column_name) VALUES (?)"; 
$params = array("Home's");  
$stmt = sqlsrv_query($conn, $sql, $params);