为什么在带有mysql_fetch_array的选择查询中不能包含where子句?

时间:2018-07-07 17:09:05

标签: php mysql sql mysqli mysqli-fetch-array

这听起来像是个菜鸟问题,但我认为我已经尝试了一切,但由于没有任何进展,我被困了数周。

这是我的工作代码:

//$connect holds my db login details so ill hide it
$query = '
SELECT *,UNIX_TIMESTAMP(CONCAT_WS(" ", ranking_data_date, ranking_data_time)) AS datetime
FROM tbl_ranking_data
ORDER BY ranking_data_date ASC, ranking_data_time ASC LIMIT 60
';

$result = mysqli_query($connect, $query);
$rows = array();
$table = array();
$table['cols'] = array(
 array(
  'label' => 'Date Time',
  'type' => 'datetime'
 ),
 array(
  'label' => 'Position',
  'type' => 'number'
 )
);

while($row = mysqli_fetch_array($result))

我的问题是,它总是从数据库中选择相同的数据(和所有数据)。

要修复此问题,理想情况下是插入where子句,例如:

WHERE user_id=$id_of_current_user

但是我不能输入任何内容,否则会出错。

与上面的代码基本相同,但有区别:

//$connect holds my db login details so ill hide it
$query = '
SELECT *,UNIX_TIMESTAMP(CONCAT_WS(" ", ranking_data_date, ranking_data_time)) AS datetime
FROM tbl_ranking_data
WHERE user_id=$id_of_current_user
ORDER BY ranking_data_date ASC, ranking_data_time ASC LIMIT 60
';

显示此错误:

  

警告:mysqli_fetch_array()期望参数1为mysqli_result,在第32行的/files/phpfile.php中给出的布尔值

我的理解:查询失败,它返回false(这就是为什么错误谈论布尔值)而不是数组($ result),但它不应该失败!

只有在添加WHERE条件后,它才会失败。

任何帮助表示赞赏。

如何在此代码中插入where子句?

1 个答案:

答案 0 :(得分:0)

查询的问题不是where子句,而是where子句中的变量。如果在出现此类问题时回显查询,则可以看到该查询的语法不正确。

PHP不会在使用单引号的字符串中替换变量值。请改用双引号。

此外,请使用反引号引起引用的列名和表名。这样可以避免保留字的问题。

最后,使用参数化查询来避免数据引用问题以及SQL注入。

//  $connect holds my db login details so I'll hide it
$query = "
SELECT 
    *,
    UNIX_TIMESTAMP(CONCAT_WS(' ', `ranking_data_date`, `ranking_data_time`)) AS `datetime`
FROM `tbl_ranking_data`
WHERE `user_id` = $id_of_current_user
ORDER BY `ranking_data_date` ASC, `ranking_data_time` ASC 
LIMIT 60;
";

$result = mysqli_query($connect, $query);
$rows = array();
$table = array();
$table['cols'] = array(
    array(
        'label' => 'Date Time',
        'type' => 'datetime'
     ),
    array(
        'label' => 'Position',
        'type' => 'number'
     )
);