我正在执行一个 CRUD,并且我正在为它的完成给予最后的打击,因为问题是,例如,如果我们在其中一个表中放置一个重复的 PK,它会由于 PDOException 引发此错误:
SQLSTATE: 23000 (ER_DUP_KEY)
但是,当然,我想知道是否有任何方法可以修改该消息。当我看到它时,我知道这是一个重复的主键,但是例如,一个从未在 DB 中看到过任何东西的用户可能不会,我不知道我是否在解释自己,我知道如果我把超过它,它会显示echo
它,但当然,它并不总是有效的错误可能是其他人。
谢谢你的帮助。
这将是对 BBDD 的建设
public function __CONSTRUCT() {
try {
$this->pdo = new PDO('mysql:host=localhost;dbname=prueba;charset=UTF8', 'root', '');
$this->pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
$this->pdo->exec("SET NAMES 'utf8';");
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
die($e->getMessage());
}
}
例如插入函数:
public function Registrar(Categoria $data) {
try {
$sql = "INSERT INTO categoria (acronimo,categoria,registro_calidad)
VALUES (?, ?,?)";
//Ejecucion de la consulta siguiente
$this->pdo->prepare($sql)->execute(array(
$data->__GET('acronimo'),
$data->__GET('categoria'),
$data->__GET('registro_calidad')
)
);
} catch (PDOException $e) {
die($e->getMessage());
}
}
PS 版本的代码,用于在响应中进行的最后一个查询,该查询被指定为有效。
public function __construct() {
try {
$this->pdo = new PDO('mysql:host=localhost;dbname=prueba;charset=UTF8', 'root', '');
$this->pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
$this->pdo->exec("SET NAMES 'utf8';");
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
die($this->getErrorMsg($e));
}
}
protected function getErrorMsg(PDOException $e) {
switch ($e->getCode()) {
case 23000:
//AQUI Analizar cual de todos los tipos es
return 'Violación de restricciones de integridad';
default:
return $e->getMessage();
case 25000:
//AQUI Analizar cual de todos los tipos es
return 'Violación de restricciones de integridad';
default:
return $e->getMessage();
}
}
翻译的错误信息
从
PHP
指示MySQL
您可以使用的错误消息的语言lc_messages
例子:
使用您的代码,您可以执行以下操作:
自定义错误消息
选项 1:映射
PDOException
提供了方法getCode
,它只返回código de la excepción
.如果您还有一个数组,可以通过代码映射错误,您可以返回自定义消息。
例子:
选项 2:面向对象
创建您自己的扩展类
PDOException
, 来自定义消息。创建您自己的扩展类,并覆盖、、等
PDO
方法,捕获异常并抛出自定义异常。使用这个新类连接到.__construct
exec
query
DB
例子:
我不知道是否为时已晚,但是,我通过以下方式解决了这个问题:
我解释一下:以防getCode()返回错误23000,我将错误字符串存储在一个变量中,然后每次有空格时用explode()将该字符串分成一个数组,然后用php的in_array()函数我看看代码 1451 是否在字符串中。
我不知道这是否是最好的方法,但它对我有用。成功。我留下代码:
尝试后{}