php - 如何检查 mysqli_fetch_array($result,MYSQLI_NUM) 是否成功获取?

标签 php mysqli prepared-statement

我是 php 学习程序风格的初学者。学习准备语句和Mysqli。 我正在尝试学习如何检查获取行是否成功或有问题。注意:在查询 mysql 数据库中的关键字后,我并不想检查是否有匹配的行。否。要搜索搜索结果,您通常使用 mysqli_stmt_num_rows()。但我使用 COUNT 函数。就像这样:

$query = "SELECT COUNT(id) From links WHERE keyword = ?";
$stmt = mysqli_stmt_init($conn);
if(mysqli_stmt_prepare($stmt,$query))
{
    mysqli_stmt_bind_param($stmt,'s',$keyword);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt,$row_count);
    if($result = mysqli_stmt_fetch($stmt))
    {
        echo 'Row Count: ' .$row_count; echo '<br>';    
    }
    else
    {
        echo 'Record fetching failed!';
        echo 'Error: ' .mysqli_stmt_error($conn);
        echo 'Error: ' .mysqli_stmt_errno($conn);
    }
    mysqli_stmt_close($stmt);
}
else
{
    echo 'Search Preparation Failed!';
}
mysqli_close($conn);

我只需要检查行是否已成功获取。需要知道尝试获取它们时是否遇到任何问题。如果有任何麻烦,那么麻烦是什么。我需要 php 来告诉我这一点。 这是我的尝试:

<?php
//5.
//MULTIPLE RECORDS FETCHING - mysqli_stmt_get_result(): mysqli_fetch_array().

//ERROR REPORTING.
ini_set('display_errors','1');
ini_set('display_startup_errors','1');
error_reporting(E_ALL);

//MYSQLI CONNECTION.
//BAREBONE TEMPLATE.
mysqli_report(MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT);

$server = 'localhost';
$user = 'root';
$password = '';
$database = 'bruteforce';

if(!$conn = mysqli_connect("$server","$user","$password","$database"))
{
    echo 'Mysqli Connection Error' .mysqli_connect_error($conn);
    echo 'Mysqli Connection Error Number' .mysqli_connect_errno($conn);
}

mysqli_set_charset($conn,'utf8mb4');

//QUERY DATABASE.
$keyword = 'keywords';

$query = "SELECT id,date_and_time,domain,domain_email,ip,url,anchor,title,description,keyword,keyphrase From links WHERE keyword = ?";
$stmt = mysqli_stmt_init($conn);
if(mysqli_stmt_prepare($stmt,$query))
{
    mysqli_stmt_bind_param($stmt,'s',$keyword);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    while($col = mysqli_fetch_array($result,MYSQLI_NUM))
    {
        $id = $col['0'];
        $url = $col['5'];
        $title = $col['7'];
        $description = $col['8'];
        $keyword = $col['9'];
        
    echo 'Id: ' .$id; echo '<br>';
    echo 'Url: ' .$url; echo '<br>';
    echo 'Title: ' .$title; echo '<br>';
    echo 'Description: ' .$description; echo '<br>';
    echo 'Keyword: ' .$keyword; echo '<br>';
    }
//WHICH ONE OF THESE 15 IFs BELOW ARE VALID ?
//if($col == FALSE) //Output: Record fetching failed!Error: Error: 0
    //if($col === FALSE) //Output: Blank
    //if(!$col) //Output: Record fetching failed!Error: Error: 0
    //if(!$col = mysqli_fetch_array($result)) //Output: Record fetching failed!Error: Error: 0
    //if(!$col == mysqli_fetch_array($result)) //Output: Blank
    //if(!$col === mysqli_fetch_array($result)) //Output: Blank
    //if($col != mysqli_fetch_array($result)) //Output: Blank
    //if($col !== mysqli_fetch_array($result)) //Output: Blank
    //if($col !=== mysqli_fetch_array($result)) //Output: Parse error: syntax error, unexpected '=' in ...
    //if(mysqli_fetch_array($result) == FALSE)//Output: Record fetching failed!Error: Error: 0
    //if(mysqli_fetch_array($result) === FALSE) //Output: Blank
    
    if(!mysqli_fetch_array($result))//Output: Record fetching failed!Error: Error: 0
    //if(mysqli_fetch_array($result) != FALSE) //Output: Blank
    //if(mysqli_fetch_array($result) !== FALSE) //Output: Record fetching failed!Error: Error: 0---
    //if(mysqli_fetch_array($result) !=== FALSE) //Output: Parse error: syntax error, unexpected '=' in ...
    
{
    echo 'Record fetching failed!';
    echo 'Error: ' .mysqli_stmt_error($stmt);
    echo 'Error: ' .mysqli_stmt_errno($stmt);
}
mysqli_stmt_close($stmt);
}
mysqli_close($conn);
?>

我知道有不止一种方法可以使用 mysqli 检查获取数据是否成功。我正在尝试 15 种不同的方法来查看“mysqli_fetch_array($result,MYSQLI_NUM)”是否有效。我在我测试的 15 行每一行的注释上写下了我的实验结果。请注意我的代码底部附近的 15 个 IF,并向我指出这 15 个中的所有有效IF。这样,我就可以学到不止一种编码方式。 作为奖励,不要介意向我展示比我的 15 个 IF 更好的检查方法,使用 mysqli 和准备好的语句。

谢谢。

编辑: 在阅读了对我的问题的答复后,我意识到,特别是从 Dharman 的答复中,没有必要检查 mysqli_fetch_array() 是否出了问题。因此,当我问你们以下哪些 IF 是有效的时,我现在意识到它们都不是有效的:

//if($col == FALSE) //Output: Record fetching failed!Error: Error: 0
    //if($col === FALSE) //Output: Blank
    //if(!$col) //Output: Record fetching failed!Error: Error: 0
    //if(!$col = mysqli_fetch_array($result)) //Output: Record fetching failed!Error: Error: 0
    //if(!$col == mysqli_fetch_array($result)) //Output: Blank
    //if(!$col === mysqli_fetch_array($result)) //Output: Blank
    //if($col != mysqli_fetch_array($result)) //Output: Blank
    //if($col !== mysqli_fetch_array($result)) //Output: Blank
    //if($col !=== mysqli_fetch_array($result)) //Output: Parse error: syntax error, unexpected '=' in ...
    //if(mysqli_fetch_array($result) == FALSE)//Output: Record fetching failed!Error: Error: 0
    //if(mysqli_fetch_array($result) === FALSE) //Output: Blank
    
    if(!mysqli_fetch_array($result))//Output: Record fetching failed!Error: Error: 0
    //if(mysqli_fetch_array($result) != FALSE) //Output: Blank
    //if(mysqli_fetch_array($result) !== FALSE) //Output: Record fetching failed!Error: Error: 0---
    //if(mysqli_fetch_array($result) !=== FALSE) //Output: Parse error: syntax error, unexpected '=' in ...

我查了很多教程。他们通常会显示这样的内容(达曼也展示了这一点):

if(mysqli_stmt_prepare($stmt,$query))
{
    mysqli_stmt_bind_param($stmt,'s',$keyword);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt))
    while($col = mysqli_fetch_array($result,MYSQLI_NUM))
    {
        $id = $col['0'];
        $url = $col['5'];
        $description = $col['8'];
        $keyword = $col['9'];
            
        echo 'Id: ' .$id; echo '<br>';
        echo 'Url: ' .$url; echo '<br>';
        echo 'Description: ' .$description; echo '<br>';
        echo 'Keyword: ' .$keyword; echo '<br>';
    }
    mysqli_stmt_close($stmt);
}
mysqli_close($conn);

请注意,在教程中,他们没有类似以下内容来检查 mysqli_stmt_get_result() 或 mysqli_fetch_array() 是否失败。

1.

if(!$result = mysqli_stmt_get_result($stmt))
  • if(!mysqli_fetch_array($result))
    

    但我还是想检查一下这两行是否有问题。 既然你们已经告诉我了,那么第一个就不太可能出问题。我现在还剩下关于第二个问题的问题。 因此,我问:尝试使用 mysqli_stmt_get_result() 获取结果时是否有可能出错?如果是这样,那么如何检查呢?简而言之,以下哪些新 IF 是有效的(如果有)?

    //if($result == FALSE) //Output: Blank
        //if($result) === FALSE //Output: Parse error: syntax error, unexpected '===' (T_IS_IDENTICAL) in ..
        //if(!$result) //Output: Blank
        //if(!$result = mysqli_stmt_get_result($stmt)) //Output: Record fetching failed!Error: Error: 0
        //if(!$result == mysqli_stmt_get_result($stmt)) //Output: Record fetching failed!Error: Error: 0
        //if(!$result === mysqli_stmt_get_result($stmt)) //Output: Record fetching failed!Error: Error: 0
        //if($result != mysqli_stmt_get_result($stmt)) //Output: Blank
        //if($result !== mysqli_stmt_get_result($stmt)) //Output: Blank
        //if($result !=== mysqli_stmt_get_result($stmt)) //Output: Parse error: syntax error, unexpected '=' in ...
        //if(mysqli_stmt_get_result($stmt) == FALSE)//Output: Record fetching failed!Error: Error: 0
        //if(mysqli_stmt_get_result($stmt) === FALSE) //Output: Record fetching failed!Error: Error: 0
    

    这是脚本的新上下文:

    <?php
    //5.
    //MULTIPLE RECORDS FETCHING - mysqli_stmt_get_result(): mysqli_fetch_array().
    
    //ERROR REPORTING.
    ini_set('display_errors','1');
    ini_set('display_startup_errors','1');
    error_reporting(E_ALL);
    
    //MYSQLI CONNECTION.
    //BAREBONE TEMPLATE.
    mysqli_report(MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT);
    
    $server = 'localhost';
    $user = 'root';
    $password = '';
    $database = 'brute';
    
    if(!$conn = mysqli_connect("$server","$user","$password","$database"))
    {
        echo 'Mysqli Connection Error' .mysqli_connect_error($conn);
        echo 'Mysqli Connection Error Number' .mysqli_connect_errno($conn);
    }
    
    mysqli_set_charset($conn,'utf8mb4');
    
    //QUERY DATABASE.
    $keyword = 'keywordsd';
    
    $query = "SELECT id,date_and_time,domain,domain_email,ip,url,anchor,title,description,keyword,keyphrase From links WHERE keyword = ?";
    $stmt = mysqli_stmt_init($conn);
    if(mysqli_stmt_prepare($stmt,$query))
    {
        mysqli_stmt_bind_param($stmt,'s',$keyword);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);
        //WHICH OF THESE FOLLOWING IFs ARE VALID ?
        //if($result == FALSE) //Output: Blank
        //if($result) === FALSE //Output: Parse error: syntax error, unexpected '===' (T_IS_IDENTICAL) in ..
        //if(!$result) //Output: Blank
        //if(!$result = mysqli_stmt_get_result($stmt)) //Output: Record fetching failed!Error: Error: 0
        //if(!$result == mysqli_stmt_get_result($stmt)) //Output: Record fetching failed!Error: Error: 0
        //if(!$result === mysqli_stmt_get_result($stmt)) //Output: Record fetching failed!Error: Error: 0
        //if($result != mysqli_stmt_get_result($stmt)) //Output: Blank
        //if($result !== mysqli_stmt_get_result($stmt)) //Output: Blank
        //if($result !=== mysqli_stmt_get_result($stmt)) //Output: Parse error: syntax error, unexpected '=' in ...
        //if(mysqli_stmt_get_result($stmt) == FALSE)//Output: Record fetching failed!Error: Error: 0
        //if(mysqli_stmt_get_result($stmt) === FALSE) //Output: Record fetching failed!Error: Error: 0
        {
            die('mysqli_stmt_get_result() Failed!);
        }
        else
        {
            while($col = mysqli_fetch_array($result,MYSQLI_NUM))
            {
                $id = $col['0'];
                $url = $col['5'];
                $description = $col['8'];
                $keyword = $col['9'];
                
                echo 'Id: ' .$id; echo '<br>';
                echo 'Url: ' .$url; echo '<br>';
                echo 'Description: ' .$description; echo '<br>';
                echo 'Keyword: ' .$keyword; echo '<br>';
            }
        mysqli_stmt_close($stmt);
        }
    }
    mysqli_close($conn);
    echo '<b>'; echo __LINE__; echo '</b>'; echo '<br>';
    ?>
    
    

    最佳答案

    你的问题并不像人们想象的那么愚蠢。但是,获取结果失败的可能性极小。我自己也尝试过让这个功能崩溃,但始终没能实现。

    这种情况不太可能发生,我建议不要再担心了。只要正确编写整个代码,代码就不会失败。如果你想彻底,那么你可以在调用mysqli_fetch_array之后立即调用mysqli_error()来查看是否有错误。 自动错误报告甚至不涵盖这种情况,但万一出现问题,PHP 会显示警告。如果您看到警告“读取行时出错”,那么您很可能发现了 PHP 中尚未发现的错误,而不是其他任何错误。

    所以,别再担心这个功能了。


    附注你的代码充满了 cargo 崇拜的做法。根据经验,如果您启用了 mysqli 错误报告,则无需检查任何函数的返回值。如果发生这种情况,PHP 会自动触发错误。函数调用失败而没有错误的可能性仍然很小,但这种可能性很小,因此您不应该在代码中担心它。

    这里是同样的事情,但是没有任何冗余代码:

    <?php
    
    //5.
    //MULTIPLE RECORDS FETCHING - mysqli_stmt_get_result(): mysqli_fetch_array().
    
    //ERROR REPORTING.
    ini_set('display_errors', '1');
    ini_set('display_startup_errors', '1');
    error_reporting(E_ALL);
    
    //MYSQLI CONNECTION.
    //BAREBONE TEMPLATE.
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    
    $server = 'localhost';
    $user = 'root';
    $password = '';
    $database = 'bruteforce';
    
    $conn = mysqli_connect($server, $user, $password, $database);
    
    mysqli_set_charset($conn, 'utf8mb4');
    
    //QUERY DATABASE.
    $keyword = 'keywords';
    
    $query = "SELECT id,date_and_time,domain,domain_email,ip,url,anchor,title,description,keyword,keyphrase From links WHERE keyword = ?";
    
    $stmt = mysqli_prepare($conn, $query);
    mysqli_stmt_bind_param($stmt, 's', $keyword);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    while ($col = mysqli_fetch_row($result)) {
        $id = $col[0];
        $url = $col[5];
        $title = $col[7];
        $description = $col[8];
        $keyword = $col[9];
    
        echo 'Id: ' .$id;
        echo '<br>';
        echo 'Url: ' .$url;
        echo '<br>';
        echo 'Title: ' .$title;
        echo '<br>';
        echo 'Description: ' .$description;
        echo '<br>';
        echo 'Keyword: ' .$keyword;
        echo '<br>';
    }
    

    关于php - 如何检查 mysqli_fetch_array($result,MYSQLI_NUM) 是否成功获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67502698/

    相关文章:

    php - 如何使用 codeigniter 从本地主机发送电子邮件?

    javascript - 逐步上传页面内容(不必等到所有内容都加载完毕)

    php - 如何从表中检索从第 n 行开始的所有行

    mysql - 尽管在授权的IP范围内,仍无法连接到Google Cloud SQL数据库

    php - bind_param() 在第一个非数字字符处截断输入

    java - Android Spinner 所选项目未显示

    php - PDO 准备语句返回 0 行,但查询工作正常

    java - 使用 PreparedStatement 将日期插入 MySQL 数据库

    java - MySQL 的准备语句,以便它会选择包含最高时间戳的行,该列将比给定参数更大?

    php - 付款后如何定义 redirect_to url?