使用 DB::query 处理 Silverstripe 中的 MySQL 错误
Handle MySQL error in Silverstripe with DB::query
我正在寻找一种方法来在使用 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 错误的方式,因此您可以 catch/prevent 显示一条消息。 The second parameter of DB::query()
is for controlling the error level.
让我们更深入地研究 SilverStripe 代码和 look at how the MySQLDatabase
class handles it(请注意,SilverStripe 的其他 SQL 数据库实现可能会以不同方式处理此问题)。
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)。
不幸的是,您无法捕获生成的错误(至少在没有 setting an error handler) as the property "dbConn" shown as $this->dbConn->error
is a protected property.
的情况下无法捕获
我正在寻找一种方法来在使用 DB::query()
这是代码:
$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 错误的方式,因此您可以 catch/prevent 显示一条消息。 The second parameter of DB::query()
is for controlling the error level.
让我们更深入地研究 SilverStripe 代码和 look at how the MySQLDatabase
class handles it(请注意,SilverStripe 的其他 SQL 数据库实现可能会以不同方式处理此问题)。
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)。
不幸的是,您无法捕获生成的错误(至少在没有 setting an error handler) as the property "dbConn" shown as $this->dbConn->error
is a protected property.