检查MySQL查询是否返回任何东西时遇到麻烦


Having trouble checking if MySQL query returned anything

我是这么做的

  1. 我正在检查是否有一个"版本"值在URL $get_version.
  2. 从数据库中获取最新版本,并设置为默认变量。
  3. 如果URL变量是好的,检查数据库是否存在,然后设置适当的变量。
  4. 如果不存在,使用上面的默认值

它总是转到"错误查询部分"。要么我的查询是错误的,要么我的if语句不工作。

这是我的代码。还有,有没有更干净的方法?

// Check if there's a version in URL. If not, set to empty.
$get_version = isset($_GET['version']) ? $_GET['version'] : '';

    // Set defaults if nothing in URL
    $query = "SELECT * FROM sn_hockey_versions ORDER BY version_id DESC LIMIT 1";
    mysqli_query($db, $query) or die('Error querying database.');
    $result = mysqli_query($db, $query);
    while ($row = mysqli_fetch_array($result)) {
        $newest_version_id = $row['version_id'];
        $newest_sections = $row['sections'];
    }
    if (!empty($get_version) && preg_match('/^[0-9.]*$/', $get_version)) { 
      $query = "SELECT version_id, sections FROM sn_hockey_versions WHERE version = '".$get_version."'";
      mysqli_query($db, $query) or die('Error querying database.');
      $result = mysqli_query($db, $query);

      if ($row = mysqli_fetch_array($result)) {
          $set_version = $row['version_id'];
          $v_sections = $row['sections'];
          $test = "IT WORKS!!!!";
      }
      else {
          $set_version = $newest_version_id;
          $v_sections = $newest_sections;
          $test = "Bad query";
      }
    }
    else {
      $set_version = $newest_version_id;
      $v_sections = $newest_sections;
      $test = "Set default";
    }

你的条件if语句检查是否$rows设置为mysql_fetch_array($result),而不是它是否返回任何结果。如果查询返回结果,则条件语句返回true,将$row设置为结果数组,然后计算If块。否则,$row被设为null,使条件为假,并执行else块。

因为你的else语句正在求值,这让我相信查询有问题,可以通过打印出数组的结果来测试。虽然有许多方法可以检查查询是否返回任何结果,但为了防止代码中出现混乱,在获取结果之前检查mysql_num_rows的值将是更好的解决方案:

  if (mysqli_num_rows($result) > 0) {
      $row = mysqli_fetch_array($result)

有关mysqli_num_rows的更多信息,请查看http://php.net/manual/en/mysqli-result.num-rows.php

参见:检查mysql_query()是否返回任何结果的正确方法是什么?

为了使代码更高效,我的另一个建议是:只在必要时查询数据库的默认版本。太多不必要的查询会导致数据库性能问题。实现此目的的一种方法是将默认版本查询放入函数中,并仅在"bad query"set default"块中调用它。

要检查它在代码外部是否成功,复制查询并在phpmyadmin或通过ssh运行它,以查看它是否返回结果。如果它返回结果,那么在代码中放入一些停止检查,以查看得到的结果。Like so

 echo '<pre>jwow',print_r($result,1),'</pre>';
 die('here');

把它放在你想检查的结果下面。我喜欢用不同的名称来命名查询结果。比如$defaults_results和$version_results。如果它是得到"坏查询",你会发现你的错误后,尝试。如果在phpmyadmin中没有返回结果,那么读取它给出的错误。