微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我是 PHP 学习程序风格的初学者。学习准备好的 Statements 和 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,$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_stmt_prepare($stmt,$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');
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",'utf8mb4');

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

$query = "SELECT id,$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 '=' 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_error() 后立即调用 mysqli_fetch_array 以查看是否有错误。 自动错误报告甚至不包括这种情况,但万一出现问题,PHP 会显示警告。如果您曾经看到警告“读取行时出错”,那么您很可能在 PHP 中发现了一个尚未发现的错误,而不是其他任何错误。

所以,不要担心这个功能。


附言你的代码充满了货物崇拜的做法。根据经验,如果您启用了 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>';
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。