2012-01-11 30 views
0

我有2個數據庫表(爲一個預訂系統)具有以下結構:mySQL的查詢多個 - 返回錯誤mysql_fetch_array

房間:

  • id_quarto
  • tipo_quarto
  • vista_quarto

飯店預訂:

  • id_reserva
  • n_cliente
  • id_quarto
  • check_in
  • check_out

我希望查詢返回quartos(室)提供(與場id_quarto/tipo_quarto/vista_quarto從它),它的arent已經被預訂了飯店預訂(預訂),所以我寫了下面的查詢(也撿信息從以前的表格):

注意:此時我不考慮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 2012-01-11 10:50:48

+2

歡迎來到堆棧溢出!你顯示的代碼容易受到[SQL注入](http://php.net/manual/en/security.database.sql-injection.php)的影響。在你的庫中使用正確的衛生方法(比如'mysql_real_escape_string()'),或者切換到PDO並準備好語句。 – 2012-01-11 10:51:14

+1

@ v01pe('!=','<>')都很好,並且相同:[<>,!= on MySQL manual](http://dev.mysql.com/doc/refman/5.0/en/比較-operators.html#operator_not-相等)。 – 2012-01-11 10:53:40

回答

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)) { 

添加:來自於用戶的每個參數使用mysql_real_escape_string防止SQL注入。

+1

這是正確的方向,但它沒有在查詢中進行任何錯誤檢查,所以如果出現任何錯誤,如果查詢失敗,它將中斷。如何做到這一點在[mysql_query()'](http://php.net/mysql_query)手冊或本[參考問題。](http://stackoverflow.com/questions/6198104/reference什麼是一個完美的代碼樣本使用mysql的擴展) - 此外,這仍然是脆弱的SQL注入 – 2012-01-11 10:52:36

+0

@皮卡,但這是一個有點不同的話題頁上描述'mysql_query'(鏈接在答案中提供)。 – 2012-01-11 10:57:30

+1

我至少會修復SQL注入。在一個被接受的答案中有這個不是一件好事。 – 2012-01-11 10:58:52

-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 2012-01-11 11:04:54

+0

關於':'和'endwhile',這是不正確的。請先確認你的建議是否準確。 – 2012-01-11 11:55:52

+0

噢,你的答案頂部的字符串將需要分隔... – 2012-01-11 11:55:59