Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用mysqli\u stmt\u bind\u result时,在哪一行检查数据获取是否成功?_Php_Mysqli_Prepared Statement - Fatal编程技术网

Php 使用mysqli\u stmt\u bind\u result时,在哪一行检查数据获取是否成功?

Php 使用mysqli\u stmt\u bind\u result时,在哪一行检查数据获取是否成功?,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我需要向网站访问者表明,如果他对我的数据库进行的查询在技术上失败,就会出现问题。 想得到的php代码回音抱歉!出了点问题!如果由于某种原因数据获取失败 以下是我试图实现这一目标的一些方法。 3个样品。 它们导致无休止的循环,从而使我的浏览器崩溃。 注意每个样品上的IFs。这就是3个样本的不同之处 我根据最喜欢的人给他们排序。。。。 如何将此修复到最低限度以达到我的目的?如有样品,将不胜感激。我知道如何通过mysqli_stmt_get_result实现这一点,但需要学习过程式编程中的mysqli

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

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

我根据最喜欢的人给他们排序。。。。 如何将此修复到最低限度以达到我的目的?如有样品,将不胜感激。我知道如何通过mysqli_stmt_get_result实现这一点,但需要学习过程式编程中的mysqli_stmt_bind_result。还没有进入oop。也不是pdo

一,


基本上,所有的方法都是错误的。如果查询失败,那么只要启用了错误报告,PHP就会自动触发错误,请参阅。您不应该手动检查它。您的代码比需要的要长得多。考虑如何正确地进行:< /P>
<?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_结果只需调用一次。它的目的是提供变量占位符,数据将填充到其中。

它们是代码中的一个错误,使代码永远循环。在这种情况下,代码中的while循环是导致此类问题的最常见原因之一

当你使用任何函数时,你应该考虑阅读这个函数的文档并检查它能给你带来什么样的错误和什么样的结果。函数可以抛出错误、警告、异常或返回错误代码。也不要低估每个函数的PHP文档中的示例。它让你对事物的运作有一个很好的了解

调用函数时,通常最好检查返回的结果。我不会在这里重写所有文档,但这里有一个mysqli_stmt_bind_结果的示例:

程序示例的这一部分对您很重要:

/*将变量绑定到准备好的语句*/ mysqli_stmt_bind_result$stmt、$col1、$col2; /*获取值*/ 而mysqli_stmt_获取$stmt{ printf%s%s\n,$col1,$col2; } 在这里,您可以看到如何将mysqli_stmt_bind_result和mysqli_stmt_fetch一起用于循环遍历结果。 但这对于错误检查来说并不完美。 mysqli_stmt_bind_结果的文档在“返回值”部分中说明:

成功时返回true,失败时返回false

因此,如果此功能出现故障,您可以通过以下方式检查错误:

如果mysqli_stmt_bind_结果$stmt、$id、$domain{ diemysqli_stmt_bind_结果失败!;//当然你可以使用比死亡更复杂的东西。。。 } 在成功的情况下,无限循环的来源在这里,它返回true。所以在mysqli_stmt_bind_result$stmt,$id,$domain时这样做是错误的,首先因为你不必循环这个函数,这是mysqli_stmt_fetch的工作,其次因为mysqli_stmt_bind_result在你的情况下会返回true,而while循环永远不会结束

对于mysqli_stmt_fetch now,有一个微妙的区别。检查返回值:

返回值 描述 符合事实的 成功数据已被提取 错误的 发生错误 无效的 不再存在行/数据或发生数据截断
为什么有这么多代码?你不应该在循环中绑定。您应该绑定一次并获取一个loop.FYI如果您刚刚开始学习PHP,那么您应该学习PDO而不是mysqli。PDO更简单,更适合初学者。从这里开始&首先学习mysqli对你来说将是一次可怕的经历。@Dharman,大约在5年前,我曾多次被sugegsted pdodelusions.com网站上提到过,但pdo让我进入了那个网站。将尝试您的另一个链接websitebeaver.com,看看这是否会使学习更容易。@El_Vanja,感谢您明确表示我只需要对mysqli_stmt_bind_结果进行一次而不是每次WHILE循环一次。我想,因为在每个循环中都会提取一个新行,所以每次都必须绑定新行的数据。现在,从您的提示中,我了解到,当我绑定一次时,php会理解哪些$vars mysqli_stmt_bind_result$stmt,$var表示哪些mysql tbl cols,因此不需要在每个循环中教授它。感谢您的示例。我知道如何使用mysqli\u stmt\u获取结果。我厌倦了。mysqli_stmt_bind_结果似乎没有那么多代码
我已经忘记了很多内容,所以再次使用它。mysqli\u stmt\u bind\u result肯定比get\u result更具代码性,尤其是在有很多列的情况下。这是一个偏好问题,但是您可以使用get\u resultSo做更多的事情,我应该只使用mysqli\u stmt\u fetch行上的WHILE循环?就像我们在mysqli_stmt_get_result上所做的那样?是的,这是正确的,因为我认为:1你没有回答如何说出错了的问题?2你是在告诉学习这门语言的人,忽略所有的错误检查。而且不仅错误3 OP需要学习mysqli_stmt_bind_结果,因此您的建议是离题的,您不需要解释无休止的循环。为什么不至少使用PDO呢?4这只是我的观点,但过程风格是旧PHP时代的遗物。不是真的。非常感谢!如果我还记得你刚才说的话,那么我应该马上开始成为一名更好的程序员!你在一篇文章中解释了所有关于php内置函数的必要基础知识,这是我5年来从未在其他论坛上学习过的!
<?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

$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>';
}