我和内森有同样的问题($wpdb->last_error doesn't show the query on error), 显然,针对特定情况的解决方案是将数据类型更改为导致错误的列。。。但如果错误不同,例如,日期不正确,或字段不支持的空值,我可以显示当$ wpdb-> insert ($ this-> table, $ data_)
执行功能;
我试图通过将该函数封装在try {}
catch {}
但我没有预期的行为。我分享了我在类示例中使用的示例代码。php文件。
<?php
class Example{
function insert_example(&$msgError){
$msgError=\'\';
global $wpdb;
try{
//throw new Exception(\'Help please!!!!\'); //This works correctly
$wpdb->query(\'SET AUTOCOMMIT = 0\');// Specify 0 here
// Start Transaction
$wpdb->query( "START TRANSACTION" );
//Inserto cabecera
$resul_insert_01 = $wpdb->insert( \'wp_wc_xxxxxx\',
array(
\'column_01\' => $arry001[\'column_01\'],
\'column_02\' => $arry001[\'column_01\'],
)
);
if (!($resul_insert_01))
{
$wpdb->query( "ROLLBACK" );
throw new Exception(\'No se pudo grabar la informacion en wp_wc_xxxxxx\');
//exit($e->getMessage());
//exit();
}
$Id_new = $wpdb->insert_id;
//Insert details 01
foreach ($array002 as $arr002) {
$resul_insert_02 = $wpdb->insert( \'wp_wc_yyyyyy\',
array(
\'id_wp_wc_xxxxxx\' => $Id_new,
\'column_01\' => $arr002[\'column_01\'],
\'column_02\' => $arr002[\'column_02\']
)
);
if (!($resul_insert_02))
{
$wpdb->query( "ROLLBACK" );
throw new Exception(\'No se pudo grabar la informacion en wp_wc_yyyyyy\');
//exit($e->getMessage());
//exit();
}
}
//Insert details 02
foreach ($array003 as $arr003) {
$resul_insert_03 = $wpdb->insert( \'wp_wc_zzzzzz\',
array(
\'id_wp_wc_xxxxxx\' => $Id_new,
\'column_01\' => $arr003["column_01"],
\'column_01\' => \'0000\' //column length is 2, but try insert 4 characters
)
);
if (!($resul_insert_03))
{
$wpdb->query( "ROLLBACK" );
throw new Exception(\'No se pudo grabar la informacion en wp_wc_zzzzzz\');
}
}
//Confirmo transacción
$wpdb->query( "COMMIT" );
return true;
}catch ( Exception $e ) {
//$wpdb->query( "ROLLBACK" );
$msgError = $e->getMessage();
//echo $e->getMessage();
return false;
}
}
}
如果我删除行中的注释
* // throw new Exception (\'Help please !!!!\'); *
, 如果我得到了预期的行为,也就是说,我在变量$msgError中捕捉到了错误,但对于其余的错误,我无法获得在指示*//列长度为2的行上发生的其他错误,但尝试插入4个字符*当我从另一端(test.php)调用函数时,它不会检测到错误,代码执行也不会进行,但是没有任何错误消息的示例。我想做的是,捕获数据库中发生的错误消息,并将其作为注释插入woocommerce订单中。
SO网友:mozboz
这并不能直接回答您的问题,但这里的解决方案是在将数据扔进数据库并祈祷之前验证数据。
“顺理成章”发送坏数据,以便其他人可以检查并向您报告,如果这不是他们所期望的,那就是糟糕的设计。首先,您不知道为什么数据不好,而在这种情况下,无论是谁,实际上都在为您检查数据,并希望他们能为您提供所需的信息类型,您的错误报告能力有限。
您在这里所做的一切努力都是为了让Wordpress或MySQL告诉您出了什么问题,只需检查一下您自己,就可以在很大程度上减轻这些努力:1. what is the data you\'ve got, 2. what is the datatype of the field it\'s going on? 这些事情应该在您的代码中的同一级别知道,不要只是猜测。如果您不知道如何查找该列的数据类型,那么这听起来像是一个值得解决的大问题。
"Be conservative in what you send, be liberal in what you accept"
因此,您可以自己编写几个快速函数,或者使用PHP之类的东西
is_numeric 或
date_parse_from_format 知道您拥有正确的数据,并在访问数据库之前安全退出。这是一个特别好的主意,因为您可能会得到数据,这实际上是有效的,但并不意味着有一些要求
you 有E、 这可能是一个有效的日期,但在1000年前。或者它可能是一个1Mb长的字符串,或者是一个字符长的字符串,也许您知道这是无效的,但数据库不会。
很抱歉,这对直接回答您的问题没有多大帮助-正如您链接的问题中有人所做的那样,您可能希望查看您正在调用的Wordpress代码是什么样子,以了解它在做什么,或者您也可以查看编写自己的INSERT语句,并以更简单的方式调用这些语句,以便更直接地访问返回的错误代码。