gpt4 book ai didi

mysql - $wpdb->update 返回 0 时如何排除故障

转载 作者:行者123 更新时间:2023-11-29 07:35:24 25 4
gpt4 key购买 nike

我在我的 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。没有产生变化。检查数据库字段后,field_number 字段存储为 float 。
  6. 使用 $wpdb->prepare 运行准备好的查询。还是没有动静。准备声明如下:

$error = $wpdb->查询( $wpdb->准备( “ 更新 设置 = %s 其中 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 个字段。

最佳答案

您的最后一个问题确实与 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)

使用该值 31.3 对其运行 select 语句将计算为空:

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 )
);

我的建议是您更改字段类型。据我所知,您的插件不会因为此更改而中断。它可能发生的是一个舍入值,就像您尝试在 (6,2) 的 Decimal 字段中插入像 31.696 这样的值,它将变成 31.67。不同之处还在于该字段的值将被格式化为您选择的小数,因此 31.3 将开始显示为 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)

关于mysql - $wpdb->update 返回 0 时如何排除故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49097247/

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