2010-03-03 56 views
0

我使用PHP 5.2和Oracle Database 11.1。不要像多個變量插入PHP字符串?

代碼

$query = oci_parse($conn, "SELECT * FROM COMMENTS WHERE PINID=$pinID and COMMENTID=$commentID"); 

導致此錯誤:

Warning: oci_execute() [function.oci-execute]: ORA-00904: "COMMENTS": invalid identifier in C:\IODwww\hello.php on line 159
^

但經營這工作得很好:

$query = oci_parse($conn, "SELECT * FROM COMMENTS WHERE PINID=$pinID and COMMENTID=1"); 

這是我的注入多個變量到查詢結果字符串,還是我犯了一些其他錯誤?

+0

你確定你有一個名爲「commentID」變量,資本完全一樣? – 2010-03-03 20:11:40

+0

你確定$ commentId被定義了嗎? – Sinan 2010-03-03 20:12:24

+0

仔細檢查變量的內容,因爲您的PHP語法是有效的。 – 2010-03-03 20:12:40

回答

1

PHP字符串中的多個變量沒有問題。

要調試的問題,您可以嘗試:

var_dump("SELECT * FROM COMMENTS WHERE PINID=$pinID and COMMENTID=$commentID"); 

,看看輸出真正匹配:

string(...) "SELECT * FROM COMMENTS WHERE PINID=1 and COMMENTID=1" 

我能想到的唯一的事情就是commentID爲空或包含一個「\ n」或附在其上的東西導致錯誤。

數據庫輸出的錯誤代碼「輸入的列名缺失或無效」,如果與=1一起使用,對我而言沒有多大意義。

+0

我得到字符串(52)「SELECT * FROM COMMENTS WHERE PINID = 6和COMMENTID = 1」 – AYoung 2010-03-03 20:47:29

0

嘗試把括號內的變量:

$query = oci_parse($conn, "SELECT * FROM COMMENTS WHERE PINID={$pinID} and COMMENTID={$commentID}"); 

還要確保$commentID沒有返回空值試圖運行查詢時,這會使剛剛COMMENTID=末,並會導致錯誤。

+0

括號不會改變我的結果。如果我建立查詢,然後回顯它,我得到這個: SELECT * FROM COMMENTS WHERE PINID = 6和COMMENTID = 1 – AYoung 2010-03-03 20:20:06

2

oci_execute()的警告不是PHP警告。結果查詢有問題。

打印出來看看它。

+0

結果查詢(在oci_parse之前)是這樣的「SELECT * FROM COMMENTS WHERE PINID = 6和COMMENTID = 1 」。之後查詢是「資源ID#3」 – AYoung 2010-03-03 20:21:14

+0

'ORA-00904:"評論":invalid identifier':數據庫不知道COMMENTS是什麼。 +1 – 2010-03-03 20:52:29

3

對於性能和SQL注入的原因,你應該使用placeholder variables,就像這樣:

$query = oci_parse($conn, "SELECT * FROM COMMENTS WHERE PINID = :pinID and COMMENTID = :commentID"); 
oci_bind_by_name($query, ':pinID', $pinID, -1, SQLT_INT); 
oci_bind_by_name($query, ':commentID', $commentID, -1, SQLT_INT); 
oci_execute($query); 
+0

謝謝你有一個鏈接,解釋這一點? – AYoung 2010-03-03 20:47:56

+0

當然:http://php.net/oci_bind_by_name – Powerlord 2010-03-03 20:49:31

+0

呃,對不起,PHP的那個函數的短鏈接轉到了舊版本。真正的鏈接是http://www.php.net/manual/en/function.oci-bind-by-name.php – Powerlord 2010-03-03 20:53:02