【问题标题】:Checking for valid MySQL result resource检查有效的 MySQL 结果资源
【发布时间】:2010-10-21 10:52:25
【问题描述】:

我有这个代码:

$rows = array();
$res = mysql_query($someQuery);

if(!mysql_errno())
    while($row = mysql_fetch_assoc($res))
        $rows[] = $row;

$someQuery 是我写入表单的任意查询。 mysql_errno 在我编写包含错误的 mysql 查询时捕获了这种情况。但是,我刚刚发现,当我执行“从 table_name 删除”查询时,这当然不是错误,但同时 mysql_fetch_assoc 失败并显示“警告:mysql_num_rows():提供的参数不是有效的 MySQL 结果第 x 行 /blah/blah/file.php 中的资源。

我试图在手册中查找它(也许我只是瞎了......)但是有没有一个函数可以用来检查 $res 是否是有效的 MySQL 结果资源?

【问题讨论】:

标签: php mysql resultset


【解决方案1】:

if ($res) 应该可以正常检查它是否是资源。 is_resource() 将确定它是否是有效的资源。

您也可以检查 mysql_affected_rows 来尝试确定它是否是 INSERT/UPDATE/etc

【讨论】:

    【解决方案2】:

    除了is_resource(),你还可以使用get_resource_type()来检查它是否是一个MySQL资源。

    $res_type = is_resource($res) ? get_resource_type($res) : gettype($res);
    
    if(strpos($res_type, 'mysql') === false) {
        echo 'Invalid resource type: ' . $res_type;
    }
    

    get_resource_type() 可能会返回 "mysql link""mysql link persistent",具体取决于您的连接类型。

    【讨论】:

    • 如果谷歌将任何人带到这里,上述警告抑制技术不适用于资源类型"odbc link"
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      mysql_query() 返回truefalse 所以你可以这样检查:

      if($res) {
          // The query succeeded.
      }
      

      【讨论】:

      • 虽然这对于所描述的问题的情况是正确的,但它有点误导。如果查询以某种方式(DELETE、INSERT、DROP 等)更改了数据库,则 mysql_query() 返回 true 或 false。但是如果查询是 SELECT、SHOW、DESCRIBE 或 EXPLAIN,它会返回一个资源。
      【解决方案5】:

      也许只是将条件更改为:

      if(!mysql_errno() && @mysql_num_rows($res) > 0)
      

      如果没有行,条件将失败,@ 将抑制警告。

      【讨论】:

        【解决方案6】:

        如果您通过mysql_query 插入、更新、删除或删除,则它只会返回truefalse(取决于操作是否成功)。

        我不确定您希望资源在此实例中包含什么?

        如果需要受影响的行数,可以使用mysql_affected_rows()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-30
          • 2012-06-21
          • 1970-01-01
          • 2011-04-11
          • 2011-09-22
          • 2013-09-01
          • 2011-04-24
          • 1970-01-01
          相关资源
          最近更新 更多