2013-07-09 2 views
0

У меня есть ссылки на веб-странице, как это: http://test.com/index.php?function=news&id=88

Поэтому, когда я положил "после 88, я получаю следующее сообщение об ошибке: Предупреждение: mysql_fetch_row() ожидает параметр 1 чтобы быть ресурсом, логическим в строке ... 588

Итак, я прочитал о mysql_real_escape_string(), но я получаю идентификатор, но не знаю, как я должен предотвратить эту ошибку.

function news() 
{ 
$query = mysql_query("SELECT * FROM news WHERE id=".$_GET['id'].""); 
while($news = mysql_fetch_row($query)) 
{ 
    ... 
} 
} 
+0

Это означает, что что-то в вашем коде принимает $ _GET ['id'] и использует его непосредственно в запросе. В лучшем случае это может остановить ваши запросы. В худшем случае это позволит кому-то запустить собственный код SQL на вашем сервере. – andrewsi

+0

Используйте подготовленный оператор вместо попытки убежать. См. Http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php – MrCode

+2

[Великий эскапизм (или: что вам нужно знать для работы с текстом внутри текста)] (http: //kunststube.net/escapism/) – deceze

ответ

5

Легкий способ бросить идентификатор в целое, если идентификатор является целым числом, которое:

$id = (int)$_GET['id']; 

Но это сильно рекомендовано использовать PDO или MySQLi с подготовленными заявлениями:

http://php.net/manual/en/book.pdo.php

http://php.net/manual/en/book.mysqli.php

+0

Ну, это работает, по крайней мере, я больше не получаю ошибок. – fame

1

Y ou может выполнять перенаправление всякий раз, когда mysql_fetch_row() ничего не возвращает (т. потому что нет идентификатора 89)

Что-то вроде:

if (!$row = mysql_fetch_row($result)) { 
    header(Your error page); 
} 
+0

Проблема SQL-инъекции. Он ввел «88» в качестве идентификатора, и это сломало запрос. –

0

Вашего код предполагает, что запрос был успешным без проверки. Для целей отладки добавьте строку 'или die (mysql_error()) в конец инструкции mysql_query().

$query = mysql_query("SELECT * FROM news WHERE id=".$_GET['id']."") or die(mysql_query()); 

Для более надежной обработки ошибок в производственных приложениях, проверьте значение $query и регистрирует ошибку, если оно ложно.

if (false === $query) { 
    // Log error and/or notify an administrator 
} 
else { 
    while($news = mysql_fetch_row($query)) ... 

Как указано в других ответах, вы должны убедиться, что значение параметра id является целым числом, так как ваш запрос предполагает, что это будет. Вы можете сделать это путем литья:

(int)$_GET['id'] 

или через более надежный тип проверки

if (!is_numeric($_GET['id'])) { 
    // Take appropriate action 
} 
else { 
    // Create and execute the query 
+0

Проблема заключается в SQL-инъекции. Он ввел «88» в качестве идентификатора, и это сломало запрос. –

+0

Я добавил ссылку на эту ошибку на вопрос. Я считаю, что остальное релевантно, потому что это поможет выявить такие ошибки в будущем. –

0

Предупреждение: mysql_fetch_row() ожидает параметр 1, чтобы быть ресурсоемким

Это означает, что в размере $ результата = mysql_query (....); вызов вы сделали до того, как mysql_fetch_row() завершился с ошибкой, и привел FALSE вместо ресурса (т. е. дескриптор результата запроса);

Посмотрите на запрос, разместите его, если это возможно, вот где ваша проблема.

Смежные вопросы