使用mysqli_stmt_bind_result时在哪一行检查取数据是否成功?

2023-12-01

我需要向网站访问者表明,如果他对我的数据库进行查询在技术上失败,就会出现问题。 想要让 php 代码回显“抱歉!出了问题!”如果由于某种原因数据获取失败。

以下是我试图实现这一目标的一些方法。 3 个样品。 它们会导致无休止的循环,从而使我的浏览器崩溃。 (注意每个样本的 IF。这是 3 个样本的不同之处)。

我按照最喜欢的顺序对它们进行排名...... 如何解决这个问题以达到我的目的?希望代码示例。我知道如何使用 mysqli_stmt_get_result() 实现此目的,但需要在过程式编程中学习 mysqli_stmt_bind_result() 。还没有进入oop。也没有pdo。

1.

<?php

//LOOPS NEVERENDING

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

$conn = mysqli_connect("$server","$user","$password","$database");

$keywords = 'keyword';

$query = 'SELECT id,domain from links WHERE keywords = ?';
$stmt = mysqli_stmt_init($conn);
if(mysqli_stmt_prepare($stmt,$query))
{
    mysqli_stmt_bind_param($stmt,'s',$keywords);
    if(mysqli_stmt_execute($stmt))
    {
        while($result = mysqli_stmt_bind_result($stmt,$id,$domain))
        {
            mysqli_stmt_fetch($stmt);
            
            echo 'Id: ' .$id; echo '<br>';
            echo 'Domain: ' .$domain; echo '<br>';
            
            if(!$result)
            {
                echo 'Sorry! Something went wrong. Try again later.';
            }
        }
    }
    mysqli_stmt_close($stmt);
    mysqli_close($conn);
}

?>
<?php

//LOOPS NEVERENDING

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

$conn = mysqli_connect("$server","$user","$password","$database");

$keywords = 'keyword';

$query = 'SELECT id,domain from links WHERE keywords = ?';
$stmt = mysqli_stmt_init($conn);
if(mysqli_stmt_prepare($stmt,$query))
{
    mysqli_stmt_bind_param($stmt,'s',$keywords);
    mysqli_stmt_execute($stmt);
    
    while(mysqli_stmt_bind_result($stmt,$id,$domain))
    {
        if(mysqli_stmt_fetch($stmt)) //If 'Rows Fetching' were successful.
        {
            echo 'Id: ' .$id; echo '<br>';
            echo 'Domain: ' .$domain; echo '<br>';
        }
        else //If 'Rows Fetching' failed.
        {
            echo 'Sorry! Something went wrong. Try again later.';
        }
    }       
    mysqli_stmt_close($stmt);
    mysqli_close($conn);
}

?>
<?php

//LOOPS NEVERENDING

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

$conn = mysqli_connect("$server","$user","$password","$database");

$keywords = 'keyword';

$query = 'SELECT id,domain from links WHERE keywords = ?';
$stmt = mysqli_stmt_init($conn);
if(mysqli_stmt_prepare($stmt,$query))
{
    mysqli_stmt_bind_param($stmt,'s',$keywords);
    if(mysqli_stmt_execute($stmt)) //If 'Query Execution' was successful.
    {
        while(mysqli_stmt_bind_result($stmt,$id,$domain))
        {
            mysqli_stmt_fetch($stmt);
            
            echo 'Id: ' .$id; echo '<br>';
            echo 'Domain: ' .$domain; echo '<br>';
        }       
    }
    else //If 'Query Execution' failed.
    {
        echo 'Sorry! Something went wrong. Try again later.';
    }
    mysqli_stmt_close($stmt);
    mysqli_close($conn);
}

?>


基本上,所有的方法都是错误的。如果查询失败,只要您启用了错误报告,PHP 就会自动触发错误,请参阅如何获取 MySQLi 中的错误消息?。您不应该手动检查它。您的代码比需要的要长得多。考虑一下应该如何正确完成:

<?php

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

// enable error reporting
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = mysqli_connect($server, $user, $password, $database);
mysqli_set_charset($conn, 'utf8mb4');

$keywords = 'keyword';

$query = 'SELECT id,domain from links WHERE keywords = ?';
$stmt = mysqli_prepare($conn, $query);
mysqli_stmt_bind_param($stmt, 's', $keywords);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $id, $domain);

// This loop will keep on going as long as fetch() returns true.
// It will return false when it reaches the end
while (mysqli_stmt_fetch($stmt)) {
    echo 'Id: ' .$id;
    echo '<br>';
    echo 'Domain: ' .$domain;
    echo '<br>';
}

当您启用 mysqli 错误报告时,您的代码将变得更加简单。不需要向用户发送任何特殊消息。当查询失败时,将像任何其他 PHP 错误一样触发错误并以相同的方式处理。如果您愿意,您可以自定义错误页面,但这是一个完全独立的主题。

循环开启mysqli_stmt_fetch()用于从服务器获取数据。数据会逐行读取,当没有更多行时mysqli_stmt_fetch()将返回 false。

mysqli_stmt_bind_result()只需要调用一次。其目的是提供将填充数据的变量占位符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用mysqli_stmt_bind_result时在哪一行检查取数据是否成功? 的相关文章