【问题标题】:When preparing a query, how important is it to check whether ($stmt = $mysqli->prepare($query)) is false?在准备查询时,检查 ($stmt = $mysqli->prepare($query)) 是否为假有多重要?
【发布时间】:2011-05-20 02:38:33
【问题描述】:

这只是连接到数据库时出现的问题吗? (我确实检查数据库连接是否成功)。假设我做了足够的检查以确保我的查询始终有效,是否可以跳过以下检查:

if($stmt = $db->prepare($query)) { //更多代码 }

而只是这样做:

$stmt = $db->prepare($query); //更多代码

我认为事务可能可以解决这个问题,但我的数据库表不支持事务(我使用 MyISAM 是因为我做的数据库读取多于写入)。

谢谢!

【问题讨论】:

  • 不管读/写,你几乎不应该使用 MyISAM。如果您想确定您的数据,则需要外键和事务。
  • 您认为什么时候适合使用 MyISAM?除了需要全文搜索支持之外,还有其他时间吗?
  • InnoDB 锁定行,而 MyISAM 锁定整个表。 MyISAM 是 GoDaddy 的默认数据库类型。 MyISAM 非常适合用于解决只有一个或少数人使用该系统的玩具问题,并且您不会期望同时使用大量。

标签: php mysql mysqli prepared-statement


【解决方案1】:

Tandu 在这里提供了一个严重误导性的概念,不幸的是,您已将其作为答案接受。

无论您使用的是什么数据库抽象层(您使用的是 mysqli),它实际上都取决于准备好的查询是否被模拟,或者它是否在数据库级别本机运行。如果底层数据库引擎未能“准备”它,则准备好的查询可以而且应该失败。

与你的数据库连接是否成功无关。

您绝对应该检查 prepare() 调用的返回值。如果您有编程错误,它将失败。如果您有另一个级别的应用程序问题,它将失败。等等。这就是返回值的全部意义。

如果您认为它总是好的,那么您将面临查询失败的风险,这将导致数据丢失 - 可能更多。

为了明确起见,请务必在查询可能失败的任何时候检查结果。你不知道...因此总是这样。

【讨论】:

  • 啊,我明白你的意思了。感谢您的答复。我选择了你的答案作为正确的答案。您是否同意在这种情况下,如果我创建一个包装类来处理数据库连接,如果我相应地创建一个修改过的 prepare() 函数(它处理失败的准备),那将是一种可以接受的方式吗?
  • 视情况而定,这可能是一种可以接受的处理方式。不过要小心,因为如果您使用的是之前未能执行的查询的结果,您可能会得到孤立的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2023-03-31
  • 2011-07-13
  • 2010-12-28
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多