2010-03-03 5 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», капитализируются именно так? –

+0

Вы уверены, что $ commentId определен? – Sinan

+0

Дважды проверьте содержимое ваших переменных, так как ваш синтаксис PHP действителен. –

ответ

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) «ВЫБРАТЬ * ОТ КОММЕНТАРИЙ ГДЕ PINID = 6 и COMMENTID = 1» – AYoung

0

Попробуйте поставить переменные в скобках:

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

Также убедитесь, что $commentID не возвращает пустое значение, которое оставит только COMMENTID= в конце и будет вызывать ошибку при попытке выполнить запрос.

+0

скобки не меняют мои результаты. Если я построю запрос, а затем повторю его, я получаю следующее: ВЫБЕРИТЕ * ОТ КОММЕНТАРИЙ WHERE PINID = 6 и COMMENTID = 1 – AYoung

2

oci_execute() Предупреждение не является предупреждением PHP. В результате возникает что-то не так.

Распечатайте его и взгляните на него.

+0

Итоговый запрос (до oci_parse) - это «ВЫБРАТЬ» ИЗ КОММЕНТАРИЙ ГДЕ PINID = 6 и COMMENTID = 1 ». После этого запрос будет «Идентификатор ресурса №3» – AYoung

+0

'ORA-00904: " КОММЕНТАРИИ ": недопустимый идентификатор': база данных не знает, что такое КОММЕНТАРИИ. +1 –

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

+0

Уверен: http://php.net/oci_bind_by_name – Powerlord

+0

Argh, извините, короткая ссылка PHP для этой функции относится к старой версии. Реальная ссылка: http://www.php.net/manual/en/function.oci-bind-by-name.php – Powerlord