如何在$ wpdb-> update返回0时进行故障排除

问题描述 投票:1回答:1

我在我的wordpress网站上运行以下查询

$error = $wpdb->update( $table_name, 
                        array( 'value' => $update_value ), 
                        array( 'lead_id' => $lead_id, 
                               'field_number' => 31.3 ), 
                        array( '%s' ), 
                        array( '%d', '%f' )
               );

它旨在用户最初提交表单后更新重力表单条目。此查询对24个字段运行正常,但对于2返回0。

到目前为止,我尝试了以下故障排除步骤:

  1. 将结果存储为$error并在查询后运行var_dump($error);,它返回0。
  2. 在查询之后立即运行var_dump( $wpdb->last_query );,将生成的SQL字符串复制/粘贴到phpMyAdmin中,这也会报告0行受影响。
  3. 使用以下命令在phpMyAdmin中手动选择行:SELECT * FROM `table_name` WHERE `field_number` = 31.3其中也不返回任何行。但是,我知道有些行匹配,因为我可以在表中找到它们。
  4. 使用与上面相同的查询手动选择另一个按预期更新的字段 - 这很好。
  5. $where_formatfloat改为string。没有导致变化。在检查db字段时,field_number字段存储为float。
  6. 使用$wpdb->prepare运行准备好的查询。仍然没有动静。准备声明如下:

$ error = $ wpdb-> query($ wpdb-> prepare(“UPDATE%s SET value =%s WHERE lead_id =%d AND field_number =%f”,$ table_name,$ update_value,$ lead_id,31.3));

其中,当var_dumped给出以下结果时:

string '
                    UPDATE prefix_rg_lead_detail
                    SET `value` = 'a:3:{i:0;s:9:\"Liverpool\";i:1;s:10:\"Manchester\";i:2;s:5:\"Leeds\";}'
                    WHERE `lead_id` = 4 AND `field_number` = 31.300000
                    ' (length=188)

我现在已经知道了,因为我已经尝试了所有我能想到的东西,但仍然无法获得2个字段进行更新。

mysql wordpress
1个回答
1
投票

你最后的问题确实与FLOAT类型。这是一个不精确的价值,它会引导您解决问题。虽然数据库显示值31.3,但它最有可能在数据库内部类似于31.30000000000001,这就是where条件不起作用的原因。看看这里的文档:Problems with Floating-Point Values

所以在路上让我们去测试:

create table test (
   n float
);
insert into test values (31.3);

mysql> select * from test;
+------+
| n    |
+------+
| 31.3 |
+------+
1 row in set (0.17 sec)

使用该值运行select语句31.3将评估为空:

mysql> select * from test where n=31.3;
Empty set (0.00 sec)

有几种方法可以在不更改列类型的情况下解决它:

1-使用ROUND(field,number_of_decimals)函数

mysql> select * from test where round(n,2)=31.3;
+------+
| n    |
+------+
| 31.3 |
+------+
1 row in set (0.00 sec)

2-将其转换为DECIMAL类型

mysql> select * from test where cast(n as decimal(5,2))=31.3;
+------+
| n    |
+------+
| 31.3 |
+------+
1 row in set (0.00 sec)

因此,为了使您的更新能够使用此数据,您必须在更新命令中使用以下选项之一:

$wpdb->query( $wpdb->prepare("UPDATE %s 
                                 SET value = %s  
                               WHERE lead_id = %d 
                                 AND round(field_number,2) = %f ", 
                             $table_name, 
                             $update_value, 
                             $lead_id, 
                             31.3 ) 
            );

我的建议是你改变字段类型。 AFAIK没有任何情况下您的插件可能会因此更改而中断。它可能发生的是一个舍入值,就像你试图在(6,2)的十进制字段中插入像31.696这样的值它将变成31.67。另外不同的是,该字段的值将被格式化为您选择的小数位数,因此31.3将开始apear为31.30您可以将其更改为:

alter table yourTableName modify field_name DECIMAL(6,2);

以下是对该解释的一些测试:

mysql> alter table test modify column n decimal(10,2);
Query OK, 1 row affected, 1 warning (0.90 sec)
Records: 1  Duplicates: 0  Warnings: 1

mysql> select * from test;
+-------+
| n     |
+-------+
| 31.30 |
+-------+
1 row in set (0.00 sec)

mysql> select * from test where n=31.3;
+-------+
| n     |
+-------+
| 31.30 |
+-------+
1 row in set (0.00 sec)

并显示四舍五入:

mysql> insert into test values (31.696);
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from test;
+-------+
| n     |
+-------+
| 31.30 |
| 31.67 |
+-------+
2 rows in set (0.01 sec)
© www.soinside.com 2019 - 2024. All rights reserved.