gpt4 book ai didi

php - 使用DB::query处理Silverstripe中的MySQL错误

转载 作者:行者123 更新时间:2023-12-03 07:40:50 25 4
gpt4 key购买 nike

我正在寻找一种使用DB::query()执行查询时在Silverstripe 3.1中捕获MySQL错误的方法

这是代码:

$sql = "UPDATE $table SET ,,"; // Syntax error added purposefully
foreach ($update_array as $key => $value) {
$name = $formHelpers->some_filter($key);
$content = $formHelpers->some_filter($value);
$sql .= " $name='$content',";
}
$sql = rtrim($sql, ",");
$sql .= "WHERE id=$id";

$result = DB::query($sql);

最佳答案

可以控制如何使用SilverStripe处理原始SQL错误,以便您可以捕获/阻止显示消息。 The second parameter of DB::query() is for controlling the error level

让我们进一步深入研究SilverStripe代码和look at how the MySQLDatabase class handles it(请注意,针对SilverStripe的其他SQL DB实现可能对此进行不同的处理)。

public function query($sql, $errorLevel = E_USER_ERROR) {
if(isset($_REQUEST['previewwrite']) && in_array(strtolower(substr($sql,0,strpos($sql,' '))),
array('insert','update','delete','replace'))) {

Debug::message("Will execute: $sql");
return;
}

if(isset($_REQUEST['showqueries']) && Director::isDev(true)) {
$starttime = microtime(true);
}

$handle = $this->dbConn->query($sql);

if(isset($_REQUEST['showqueries']) && Director::isDev(true)) {
$endtime = round(microtime(true) - $starttime,4);
Debug::message("\n$sql\n{$endtime}s\n", false);
}

if(!$handle && $errorLevel) {
$this->databaseError("Couldn't run query: $sql | " . $this->dbConn->error, $errorLevel);
}
return new MySQLQuery($this, $handle);
}

默认情况下,错误级别为 E_USER_ERROR,因此它将在内部调用更多位,并触发输出到屏幕的用户错误(取决于 error_reporting level)。

不幸的是,由于显示为 $this->dbConn->error的属性“dbConn”是 setting an error handler,因此您无法捕获所生成的错误(至少没有 protected property)。

关于php - 使用DB::query处理Silverstripe中的MySQL错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32207953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com