如何解决如何检查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 举报,一经查实,本站将立刻删除。