php中执行insert into on duplicate key update语句识别的问题。

发布于 2022-09-07 11:34:38 字数 1058 浏览 23 评论 0

在php项目中,通过medoo库简单连接到了mysql.由于需要批量更新配置操作,使用了insert into ... on duplicate key update语句,该语句无法却通过pdo的语法检测,php代码如下:

$medoo = new Medoo($dbcfg);

$sql = "INSERT INTO `t_config` (`name`,`value`) VALUES ('WEB_SITE_TITLE','11dd11'),('WEB_SITE_KEYWORD','22rr2') on duplicate key update `value` = VALUES(`value`); ";

$res = $medoo->exec($sql);
p($medoo->error());
p($res);

执行后报错:

Array
(
    [0] => 42S22
    [1] => 1054
    [2] => Unknown column 'WEB_SITE_TITLE' in 'field list'
)

PDOStatement Object
(
    [queryString] => INSERT INTO t_config (`name`,`value`) VALUES("WEB_SITE_TITLE","11dd11"),("WEB_SITE_KEYWORD","22rr2") on duplicate key update `value`=VALUES(`value`);
)

而拷贝该语句在命令行下运行时,该语句却正常。
而后查阅相关文档,发现medoo内源代码中有一行代码:

// Make MySQL using standard quoted identifier
$commands[] = 'SET SQL_MODE=ANSI_QUOTES';

当把这一行删除掉后,就可以运行了。
原来是因为语句中存在双引号,在 ANSI_QUOTES 启用后就通不过语法检测。

PS: 困扰了几天的问题,本来是想要提问的,没想在边提问的过程中边解决了,也是醉了。算是踩了一个medoo的坑吧。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吹梦到西洲 2022-09-14 11:34:38

测试发现,SET SQL_MODE=ANSI_QUOTES 并不是影响sql的最终原因。而是原始sql语句中不能使用双引号来引字符串。
应该用单引号',如果单号不能使用就用带转义符的\'

云裳 2022-09-14 11:34:38

ycdatabase这个数据库框架也是非常不错的。支持稳定的数据库连接, C语言扩展的,性能高。 github 地址: https://github.com/caohao-php...

优点:

1、快速 - ycdb是一个为PHP扩展写的纯C语言写的mysql数据库ORM扩展,众所周知,数据库ORM是一个非常耗时的操作,尤其对于解释性语言如PHP,而且对于一个项目来说,ORM大多数情况能占到项目很大的一个比例,所以这里我将MySQL的ORM操作用C语言实现,利用C语言的性能,提升ORM的性能。

2、安全 - ycdb能通过参数绑定的方式解决SQL注入的问题。

3、强大 - 便捷的函数,支持所有数据库操作。

4、简单 - 使用和学习非常简单,界面友好。

5、数据缓存 - ycdb支持数据缓存,你可以采用redis作为介质来缓存数据库的数据,但是记得在update、insert、delete 操作涉及到与缓存数据相关的数据修改时,需要按key删除您的缓存,以保证数据一致性。

6、连接池 - ycdb通过一种特殊的方式来建立一个稳定的与MySQL之间的连接池,性能至少能提升30%,按照 PHP 的运行机制,长连接在建立之后只能寄居在工作进程之上,也就是说有多少个工作进程,就有多少个长连接,打个比方,我们有 10 台 PHP 服务器,每台启动 1000 个 PHP-FPM 工作进程,它们连接同一个 MySQL 实例,那么此 MySQL 实例上最多将存在 10000 个长连接,数量完全失控了!而且PHP的连接池心跳机制不完善。

目录:

  • Instruction
  • Requirement
  • 创建测试表
  • 在linux中编译ycdb
  • Start ycdatabase
  • 初始化ycdb连接
  • 原生SQL执行
  • 错误处理
  • Where 语句
  • Select 语句
  • Insert 语句
  • Replace 语句
  • Update 语句
  • Delete 语句
  • 完整例句
  • 数据库事务
  • 数据缓存
  • PHP数据库连接池
  • Redis 连接池方案
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文