【问题标题】:Can anyone tell me if they see an error in the following PHP code?谁能告诉我他们是否在以下 PHP 代码中看到错误?
【发布时间】:2014-04-22 13:49:06
【问题描述】:

由于某种原因,下面的 while 循环永远不会触发。 所有这些都在一个类中。

$code = $this->get_postal_state_no('Western Cape');

private function get_postal_state_no($psn)
    {
        $sql = "
                SELECT 
                    no
                FROM  
                    ct_state 
                WHERE 
                    name LIKE('".$psn."');";
        $stmt = sqlsrv_query($this->conn1, $sql);
        // This statement is not false, so the error handling does not happen, this is expected.
        if($stmt === FALSE) 
        {
            if(($errors = sqlsrv_errors()) != NULL) 
            {
                foreach($errors as $error) 
                {
                    $sqlstate       = $error['SQLSTATE'];
                    $code           = $error['code'];
                    $sqlmessage     = $error['message'];
                }
            }
            $msg = 'Error in $stmt in get_postal_state_no() method.';
            $this->do_error_log($error_msg, $sqlstate, $code, $sqlmessage, $msg, __LINE__, __FILE__, __FUNCTION__, __CLASS__, __METHOD__);
            sqlsrv_free_stmt($stmt);
        }
        //This loop is never entered.  This is not expected.

        while($obj = sqlsrv_fetch_object($stmt)) 
        {
            echo "I am here now";
            break;  
            if(!empty($obj->no) && $obj->no != '') 
            {
                echo "Hello, I exist";
                break;
                // This break never happens
                return $obj->no;
            } 
            else 
            {
                echo "Hello, I don't exist";
                break;
                // This break never happens
                $code = $this->sp_aa_iud_ct_state($psn);
                return $code;
            }
            sqlsrv_free_stmt($stmt);
        }
    }

有人知道为什么吗?我正在使用 php_sqlserv 驱动程序。 SQL Server Profiler 将查询第一部分执行。

谢谢

J

【问题讨论】:

  • 您是否已经进行了任何调试?查询实际上返回 >0 行吗?您是否收到任何错误/通知(可能被抑制)? while() 真的到达了吗?
  • @kingkero 是的,我有。我的自定义日志记录没有错误。 while 循环中的 if 语句要么返回一个代码(如果有),或者如果没有,则调用另一个方法来创建新代码并将其返回给该方法。如果我在此之前中断,它会中断。如果我在任何 if 条件期间中断,它只会继续,因为似乎已经到了 while,但从未执行过。
  • 来自sqlsrv_fetch_object 上的 PHP 文档:成功时返回一个对象,如果没有更多行要返回,则返回 NULL,如果发生错误或指定的类不存在,则返回 FALSE . 因此,请考虑在您的 while 子句中使用适当的条件,否则它可能会以无限循环结束。

标签: php sql-server tsql


【解决方案1】:

查看sqlsrv_fetch_object 的文档页面,它说明了返回值:

成功时返回一个对象,如果没有更多行要返回,则返回 NULL,如果发生错误或指定的类不存在,则返回 FALSE。

我怀疑该函数要么返回NULL 要么返回FALSE,尽管原因还不清楚。尝试在while 循环上方添加它,看看输出是什么:

$obj = sqlsrv_fetch_object($stmt)
var_dump($obj);
die;
while($obj = sqlsrv_fetch_object($stmt)) 
{ // ...

另一个有用的调试技巧是转储查询,然后将其复制/粘贴到您的 DBMS 系统中,并直接针对您的数据库运行您在代码中执行的查询,以查看是否实际返回了任何结果:

$sql = "
    SELECT 
        no
    FROM  
        ct_state 
    WHERE 
        name LIKE('".$psn."');";
var_dump($sql);

【讨论】:

  • 谢谢!我得到了一个未处理的 NULL。
  • :) np,很高兴我能帮上忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多