2011-04-09 21 views
1

我試圖讓用戶評論我的網站上的配置文件。我有以下PHP - 更新獲取用戶評論從使用Php的Mysql

<?php 
// Insert Comments into Database that user provides 
$comm = mysql_real_escape_string($_POST['addComment']); 
$pID4 = filter_input(INPUT_GET, 'pID', FILTER_SANITIZE_NUMBER_INT); 
$cID = mysql_real_escape_string($_POST['courseInfoDD']); 
     $username = "###"; 
     $password = "####"; 
     $pdo4 = new PDO('mysql:host=localhost;dbname=###', $username, $password); 
     $pdo4->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$sth3 = $pdo3->prepare(' 
     INSERT INTO Comment (info, pID, cID) 
     VALUES(:info, :pID, :cID) 
      '); 
$sth3->execute(array(
      ':info' => $comm, ':pID' => $pID3, ':cID' => $cID 
     )); 
?> 

數據庫表 「評論」 http://postimage.org/image/16sbr0jd0/(主持人請將此轉換爲顯示圖片,請)

HTML:

<input type='text' id='addComment' name='addComment' tabindex='3' value='Enter comment' /> 

給出的錯誤:

No pID specified。當我嘗試插入評論時。

回答

0

單引號字符串中的$變量未被處理。改爲使用雙引號,併爲SQL語句本身添加引號:

$sth3 = $pdo3->prepare(" 
     INSERT INTO Comment (info, pID, cID) 
     VALUES('$comm', '$pID3', '$cID') 
      "); 
+0

考慮到他正在使用預準備語句,值不應該被注入到查詢中 - 相反,它們應該在執行語句時被綁定。 – 2011-04-09 15:39:13

+0

你能看到修改後的代碼嗎? – Jshee 2011-04-09 16:31:49

0

我們的問題與mysql沒有關係,沒有與註釋無關。

這是基本的PHP字符串語法。

如果希望在字符串中解釋變量,請使用雙引號。

但是,你不應該添加變量到查詢直接,而是他們裝倉

+0

它不是調用pID,如果我測試這個。 – Jshee 2011-04-09 16:32:13

1

到PDO準備語句的參數應該使用這樣的:

$sth3 = $pdo3->prepare(' 
     INSERT INTO Comment (info, pID, cID) 
     VALUES(:info, :pID, :cID) 
      '); 
$sth3->execute(array(
      ':info' => $comm, ':pID' => $pID3, ':cID' => $cID 
     )); 

首先成立了「插槽「爲值,然後在運行查詢時提供它們。

+0

如果我嘗試這個並嘗試提交評論,它會拋出一個錯誤,指出找不到「教授」的「pID」。我應該在查詢'WHERE pID =?'中添加這個嗎? ? – Jshee 2011-04-09 15:42:51

+0

@ user700070:否,WHERE不用於插入。看起來pID應該是URL的GET變量的一部分,如'/addcomment.php?pID = 3'所示。 – Kaivosukeltaja 2011-04-09 17:56:03

+0

這仍然沒有工作Kaivosukeltaja – Jshee 2011-04-09 21:44:26

4

你在你的INSERT語句中使用單引號:

$sth3 = $pdo3->prepare(' 
    INSERT INTO Comment (info, pID, cID) 
    VALUES($comm, $pID3, $cID) 
'); 

有了這些簡單的報價,$comm不會被評估 - 和字面$comm字符串將被髮送到數據庫 - 造成在你可能不期望的事情中。


如果你想插入變量,你應該使用double-quotes around your string

但是,當您嘗試使用準備好的語句時,實際上,您不應該這樣做

相反,您應該在語句中使用佔位符,然後在執行語句時將這些佔位符綁定到您的數據。


prepare看起來有點像這樣,我想:

$sth3 = $pdo3->prepare(' 
    INSERT INTO Comment (info, pID, cID) 
    VALUES(:comm, :pID3, :cID) 
'); 

注意:comm:pID3:cID佔位符。

,然後,在執行語句時,你實際上是通過一些真實的數據,以對應於佔位符:

$ sth3->執行(陣列( ':COMM'=> $通訊, ':pID3'=> $ pID3, ':cID'=> $ cID, ));


附加說明:由於您使用的預處理語句,你不必使用mysql_real_escape_string()(這是不是一個PDO相關的功能,順便說一句,與mysql_*功能工作時,才應使用):逃跑由準備好的語句機械化本身處理。

+0

看到我的更新代碼,這個'準備'方法似乎並沒有抓住'$ pID3 = filter_input(INPUT_GET,'pID',FILTER_SANITIZE_NUMBER_INT);' $ pID3準備爲var。 – Jshee 2011-04-09 15:49:37

+0

爲什麼這是獲得pID? – Jshee 2011-04-09 16:20:48