0

Делаю проверку на существование строки:

$check = mysql_fetch_array(mysql_query("SELECT * FROM `table` WHERE `type`='".$type."'"));
if(isset($check['id'])) {
...
}

Если не существует - выводит на страницу ошибку:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given

Как от этого избавится и есть ли тут уязвимость?

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
rimlin
  • 411

3 Answers3

1

Зачем все в одну строчку делать?

$res = mysql_query("SELECT * FROM `table` WHERE `type`='".$type."'");
if(mysql_num_rows($res) > 0){
    $check = mysql_fetch_array($res);
    echo $check['id'];
}

В этом случае, вам уже не надо проверять $check['id']

UPD Вчера не заметил в вашем вопросе по поводу уязвимостей. Не буду особо оригинальным и так же посоветую перебираться на PDO. Ну, а если использовать обычный подход для работы с БД, то конечно же надо обрабатывать данные при записи в БД: как минимум mysql_real_escape_string(), НО не менее важно экранировать на выводе. Например:

echo htmlspecialchars($check['text']);
Deonis
  • 34,025
1

уязвимость безусловно есть, вы пихаете переменную прямо в запрос к бд.. (про инъекции забыли?) pdo вам в помощь. далее - в $check надо писать результат mysql_query, потом проверять, потом делать выборку (в зависимости от результата)

chip101
  • 521
0

Перед вставкой $type в запрос переменную нужно обработать, в зависимости от её типа должна быть соответствующая проверка, тогда всё будет безопасно, если int, например

if(intval($type)!=0) { $check = mysql_fetch_array(mysql_query("SELECT * FROMtableWHEREtype='$type'")); if(isset($check['id'])) {...} }

если строка

if(!empty(mysql_real_escape_string($type))) { $check = mysql_fetch_array(mysql_query("SELECT * FROMtableWHEREtype='$type'")); if(isset($check['id'])) {...} }

Зоркий
  • 2,789
  • 16
  • 25
  • Проверки уже есть и на запрос идет строка с уже имеющимся данными, но в таблице этой строки он не находит и выводит ошибку. – rimlin Jul 07 '12 at 19:27