2012-01-11 4 views
0

У меня есть 2 таблицы базы данных (для системы бронирования) со следующими структурами:MySql многократный запрос - возвращает ошибку mysql_fetch_array

Quartos:

  • id_quarto.
  • tipo_quarto.
  • vista_quarto.

Reservas:

  • id_reserva.
  • n_cliente.
  • id_quarto.
  • check_in.
  • check_out.

Я хочу, чтобы запрос, чтобы вернуть Quartos (номера) доступно (с полями id_quarto/tipo_quarto/vista_quarto от него), которые Арент уже забронированы Reservas (оговорки), так что я пишу следующий запрос (также сбор информации из предыдущей формы):

ПРИМЕЧАНИЕ: В настоящее время я не рассматриваю параметр check_in и check_out дат ... это всего лишь тест, и поэтому я добавлю условия для его проверки, но если у кого-то есть идеи для этих условий я был бы признателен. : D

// Connect to database server 
mysql_connect("localhost", "root") or die (mysql_error()); 
// Select database 
mysql_select_db("teste") or die(mysql_error()); 
// Get data from the database 

$strSQL = "SELECT id_quarto,tipo_quarto,vista_quarto ". 
      " FROM quartos,reservas ". 
      " WHERE quartos.id_quarto!=reservas.id_quarto ". 
      " AND quartos.tipo_quarto='". $_POST['tipo_quarto'] ."' ". 
      " AND quartos.vista_quarto='". $_POST['vista_quarto'] ."'"; 

// Loop the recordset $rs 
    // Each row will be made into an array ($row) using mysql_fetch_array 
    while($row = mysql_fetch_array($rs)) { 

?> 
<table border="1"> 
    <tr align="left"> 
    <td width="75"><?php echo $row['id_quarto']; ?></td> 
    <td width="75"><?php echo $row['vista_quarto']; ?></td> 
    <td width="75"><?php echo $row['tipo_quarto']; ?></td></tr> 
    </table> 
<?php 
} 

    // Close the database connection 
// mysql_close(); ?> 

Но когда я делаю это возвращает ошибку на линию X, которая является линией, когда я мертвые записи о том, что «mysql_fetch_array() ожидает параметр 1, чтобы быть ресурсом, логический».

Почему это и что я могу сделать, чтобы предотвратить его? как я могу написать правильный код?

Кроме того, я хотел, чтобы результаты были представлены в виде элемента формы (списка/меню), чтобы пользователь мог выбирать только действительные результаты. Любая идея, как включить результаты из набора записей с этой функцией?

+0

Благодарим вас за редактирование MGA. Теперь читать легче. :) – SerafimSaudade

+2

Добро пожаловать в переполнение стека! Код, который вы показываете, уязвим для [SQL-инъекции] (http://php.net/manual/en/security.database.sql-injection.php). Используйте подходящий метод санитарии вашей библиотеки (например, 'mysql_real_escape_string()' в вашем случае) или переключитесь на PDO и подготовленные операторы. –

+1

@ v01pe both ('! =', '<>') Хороши и то же: [<>,! = В руководстве по MySQL] (http://dev.mysql.com/doc/refman/5.0/en/ Сравнение-operators.html # operator_not-равно). –

ответ

2

Вы забываете о mysql_query, изменение:

// Select database 
mysql_select_db("teste") or die(mysql_error()); 

// Get data from the database 

$strSQL = "SELECT id_quarto,tipo_quarto,vista_quarto FROM quartos,reservas WHERE quartos.id_quarto!=reservas.id_quarto AND quartos.tipo_quarto='". $_POST['tipo_quarto'] ."' AND quartos.vista_quarto='". $_POST['vista_quarto'] ."'"; 

// Loop the recordset $rs 
// Each row will be made into an array ($row) using mysql_fetch_array 
while($row = mysql_fetch_array($rs)) { 

к:

// Select database 
mysql_select_db("teste") or die(mysql_error()); 

// Get data from the database 

$strSQL = "SELECT q.id_quarto, q.tipo_quarto, q.vista_quarto ". 
      " FROM quartos q, reservas r". 
      " WHERE q.id_quarto != r.id_quarto ". 
      " AND q.tipo_quarto = '". mysql_real_escape_string($_POST['tipo_quarto']) ."' ". 
      " AND q.vista_quarto = '". mysql_real_escape_string($_POST['vista_quarto']) ."'"; 

$rs = mysql_query($strSQL); 

// Loop the recordset $rs 
// Each row will be made into an array ($row) using mysql_fetch_array 
while($row = mysql_fetch_array($rs)) { 

Добавлено: Предотвращение SQL инъекции с использованием mysql_real_escape_string по каждому параметру от пользователя.

+1

Это правильное направление, но оно не выполняет проверку ошибок в запросе, поэтому, если что-то пойдет не так, оно сломается, если запрос завершится с ошибкой. Как это сделать, описано в [manual on 'mysql_query()'] (http://php.net/mysql_query) или в этом [справочном вопросе.] (Http://stackoverflow.com/questions/6198104/reference -what-is-perfect-code-sample-using-the-mysql-extension) - также это все еще уязвимо для SQL-инъекции –

+0

@Pekka, но это немного другая тема, описанная на странице о mysql_query (ссылка предоставлено в ответ). –

+1

Я бы по крайней мере исправил SQL-инъекцию. Наличие в принятом ответе не очень хорошо. –

-1

Сравнение строк с LIKE (если они не являются индекс)

$strSQL = "SELECT id_quarto,tipo_quarto,vista_quarto FROM quartos,reservas WHERE quartos.id_quarto!=reservas.id_quarto AND quartos.tipo_quarto LIKE '". $_POST['tipo_quarto'] ."' AND quartos.vista_quarto LIKE '". $_POST['vista_quarto'] ."'"; 

while между закрытием ?> метки могут сделать разные (это понятнее ИМХО):

while($row = mysql_fetch_array($rs)) : 
?> 

и

<?php 
    endwhile; 

и да, конечно, вам нужно будет сделать фактический mysql_query, как и другие, указывающие!

+0

Построен в вашем освещении @ Michał Powaga! – v01pe

+0

О ':' и 'endwhile', это просто неверно. Пожалуйста, убедитесь, что ваши предложения точны, сначала попробовав их. –

+0

О, и эта строка в верхней части вашего ответа понадобится разграничить ... –

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