当前位置: 首页 > 面试题库 >

MySQLi准备的语句错误报告[重复]

易书
2023-03-14
问题内容

这个问题已经在这里有了答案

mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误? (1个答案)

3年前关闭。

我正在努力弄清MySQli,但我对错误报告感到困惑。我正在使用MySQLi’prepare’语句的返回值来检测执行SQL时的错误,如下所示:

$stmt_test =  $mysqliDatabaseConnection->stmt_init();
if($stmt_test->prepare("INSERT INTO testtable VALUES (23,44,56)"))
{
 $stmt_test->execute();
 $stmt_test->close();
}
else echo("Statement failed: ". $stmt_test->error . "<br>");

但是,prepare语句的返回值是否仅检测SQL语句的前置是否存在错误,而不检测执行错误?如果是这样,我应该将执行行更改为标记错误,如下所示:

if($stmt_test->execute()) $errorflag=true;

为了安全起见,在语句执行后我还应该执行以下操作:

if($stmt_test->errno) {$errorflag=true;}

…还是我可以从头开始,MySQLi prepare’语句的返回值捕获了与它定义的查询的完整执行相关的所有错误?

谢谢C


问题答案:

我在过去两天里写了两次(对我来说,这是重复的,即使问题开始有所不同)。

mysqli的每种方法都可能失败。您应该测试每个返回值。如果失败了,请考虑继续使用不在您期望的状态的对象是否有意义。(可能不是处于“安全”状态,但是我认为这不是问题。)

因为只有在最后操作的错误信息被存储在每个连接/声明可能会丢失有关的信息 是什么
,如果你继续后出了问题造成的错误。您可能希望使用该信息来让脚本决定是重试(仅是临时问题),更改某些内容还是完全纾困(并报告错误)。而且它使调试变得容易得多。

$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?,?,?)");
// prepare() can fail because of syntax errors, missing privileges, ....
if ( false===$stmt ) {
  // and since all the following operations need a valid/ready statement object
  // it doesn't make sense to go on
  // you might want to use a more sophisticated mechanism than die()
  // but's it's only an example
  die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}

$rc = $stmt->bind_param('iii', $x, $y, $z);
// bind_param() can fail because the number of parameter doesn't match the placeholders in the statement
// or there's a type conflict(?), or ....
if ( false===$rc ) {
  // again execute() is useless if you can't bind the parameters. Bail out somehow.
  die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}

$rc = $stmt->execute();
// execute() can fail for various reasons. And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( false===$rc ) {
  die('execute() failed: ' . htmlspecialchars($stmt->error));
}

$stmt->close();

编辑:六年后的几点笔记。…
mysqli扩展完全能够报告通过异常导致除0以外的(mysqli)错误代码的操作,请参见mysqli_driver :: $$
port_mode

die()确实非常粗糙,即使在这样的示例中,我也不会使用它。
因此,请仅考虑以下事实: 每个 (mysql)操作 都可能 由于多种原因而失败;甚至 ,如果 同样的事情进行得很顺利前一千倍....



 类似资料:
  • 问题内容: 我如何使用mysqli用LIKE进行查询并获得所有结果? 这是我的代码,但是不起作用: 此代码似乎不起作用。我已经搜索了很多。也可能返回多于1行。那么,即使返回的结果超过1行,我如何获得所有结果呢? 问题答案: 这是您正确获取结果的方式 或者,您也可以执行以下操作: 希望您意识到我从这里和这里的手册中直接得到了答案,这是您应该首先去的地方。

  • 问题内容: 我完全被mySQLi弄糊涂了。尽管多年来我一直在使用过程性mysql调用,但我希望习惯于为其提供的db security / mySQL注入保护编写准备好的语句。我正在尝试编写一个简单的select语句(是的,我知道为此进行程序调用可提高性能)。运行时,我会得到所有回声,直到击中组件为止。在我看来,这一切都相当简单,但是在阅读了数小时的mySQLi手册后,我感到茫然。任何想法为什么会失

  • 问题内容: 这个问题已经在这里有了答案 : 我的PDO声明无效 (1个答案) 2年前关闭。 我正在尝试使用PDO准备好的语句为MySQL数据库上的查询创建正确的错误处理。我希望程序在检测到准备好的语句过程中出现错误时退出。利用PDO准备好的语句过程中的每个步骤都会在失败时返回的事实,我将这种令人讨厌的技巧归纳为: 通过执行以下操作: 两件事情。首先,这是非常冗长而愚蠢的。肯定有更好的办法。显然,我

  • 问题内容: 我总是发现很难编写MySQLi预备语句,因为许多函数的工作方式与旧方法不同。现在我面临一个问题。 问题答案: 您正在尝试通过以下方式获取结果 事实并非如此。因为execute将仅返回布尔值。 做喜欢的。

  • 问题内容: 目前,我正在与MySQLi一起玩,试图弄清它们的工作原理。在我目前的项目中,我总是喜欢在编码时回显查询字符串,以确保一切正确,并快速调试我的代码。但是…如何使用准备好的MySQLi语句来做到这一点? 例: 我一直在浏览此列表(http://www.php.net/mysqli),但没有任何运气。 编辑 好吧,如果在MySQLi中不可能,也许我会坚持这样的事情: 显然,这还远未达到完美,

  • 问题内容: 我使用准备好的语句编写了select语句。每次尝试运行它都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做