2012-01-11 62 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