我是 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/