
有一条 pdo 的 insert into 语句,拿出来放到 mysql 执行就 OK ,放到 php 里就不行,求可能的原因。。。
$stmt = $dbh->exec("INSERT INTO `crm_ecms_fkdh` (`title`, `newstime`, `titlepic`, `swt_ksfwsj`, `swt_dhlx`, `swt_ip`, `swt_dhly`, `swt_fwly`, `swt_gjc`, `swt_weizhi`, `swt_csjdkf`, `swt_feiyong`, `swt_ccfwwz`, `swt_krsm`) VALUES ('21559', '0', '', '2016/7/19 15:59:57', '极佳对话', '220.115.231.5', 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%93%88%E5%93%88&rsv_pq=95afcefb001095ac&rsv_t=88b292b1R%2F7n0690mRIzp2BoTqwsTfK5QFKD8INH%2BaftAjE23I2Ni0gTuqk&rqlang=cn&rsv_enter=1&rsv_sug3=5&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=1686&rsv_sug4=144368', 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%93%88%E5%93%88&rsv_pq=95afcefb001095ac&rsv_t=88b292b1R%2F7n0690mRIzp2BoTqwsTfK5QFKD8INH%2BaftAjE23I2Ni0gTuqk&rqlang=cn&rsv_enter=1&rsv_sug3=5&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=1686&rsv_sug4=144368', 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%93%88%E5%93%88&rsv_pq=95afcefb001095ac&rsv_t=88b292b1R%2F7n0690mRIzp2BoTqwsTfK5QFKD8INH%2BaftAjE23I2Ni0gTuqk&rqlang=cn&rsv_enter=1&rsv_sug3=5&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=1686&rsv_sug4=144368', '天津市', '21559', '天津市', 'lxb', '医院')"); 感谢各位V友的鼎力相助,已经解决。
代码里加入了
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh = new PDO('mysql:host=172.17.0.4;dbname=crm', 'root', 'root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 没有设定编码
my.cnf中将sql_mode的STRICT_TRANS_TABLES删掉,然后重启mysql容器,插入成功。
1 fuge 2016-07-29 09:32:26 +08:00 我觉得把你的语句贴出来会好一点 |
2 acking 2016-07-29 09:34:15 +08:00 我觉得看看 mysql log , php log ,环境 log ,比较好 |
3 Hallujah 2016-07-29 09:36:21 +08:00 via Android 楼主只是想吐槽几句?我觉得半天搞不定就该拿出来让大家看看。 |
4 xiandao7997 2016-07-29 09:38:13 +08:00 转义字符 |
5 rESHARP 2016-07-29 09:38:14 +08:00 问题这样的提法,还是去问医院门口的算命先生比较合适 |
6 young 2016-07-29 09:39:48 +08:00 我觉得你连错库了.... |
7 Mac 2016-07-29 09:41:13 +08:00 单引号和双引号的问题? |
8 DT27 2016-07-29 09:42:58 +08:00 php 有错误提示啊。。。 另外一般小页面用 php 我都直接用 mysql 操作类。。。 |
9 Xrong 2016-07-29 09:47:38 +08:00 编码问题? |
10 gdtv 2016-07-29 09:49:17 +08:00 看一下 pdo 最终生成的 sql 是什么 |
11 xuhaoyangx 2016-07-29 09:49:28 +08:00 log 呢,报错的提示呢。 你需要学学如何提问 |
12 cccRaim 2016-07-29 09:50:01 +08:00 估计是某些非数字类型没有加单引号 |
13 alittletrain OP |
14 RIcter 2016-07-29 10:16:40 +08:00 PDO 的话,有 warning 就不能成功运行。 你在 MySQL 里运行的时候是不是不是 0 warnings ? |
15 DT27 2016-07-29 10:25:45 +08:00 sql 语句直接 mysql_query 没问题。。。 |
16 Mac 2016-07-29 10:26:06 +08:00 用工具比如 HEIDISQL 直接运行这段 SQL 看看错在哪,可能字段类型和长度 |
17 DT27 2016-07-29 10:27:29 +08:00 楼主可以一个字段一个字段的替换看看是不是某个字段的问题。 或者先把中文换成 1 ,其它不变。 |
18 tojoevan 2016-07-29 10:30:31 +08:00 via iPhone 每当遇到如此问题都推荐二分排除法把字段替换为 1 ,基本 5 分钟内,解决战斗 |
20 jarlyyn 2016-07-29 10:38:55 +08:00 手工拼接 sql 的勇士啊…… |
21 alittletrain OP @tojoevan 替换成 1 可以插入 |
22 alittletrain OP @jarlyyn 没办法 不让用 orm |
23 nullp 2016-07-29 11:05:07 +08:00 之前遇到过这样的问题。不过是用 php 连的 mssql 打印出来的 sql 语句直接可以执行,在 php 就是不执行。 是包含汉字的字符集编码的问题 。 不过按道理 mysql 和 php 的话都是 utf-8 应该不会有这样的问题, 你可以看下 |
24 jarlyyn 2016-07-29 11:11:46 +08:00 |
25 iyaozhen 2016-07-29 11:19:02 +08:00 via Android 应该是 url 那个值的问题, exec 方法有返回值的呀,判断一下呗,然后打印一下 SQL 和 error 。 还有用了 PDO 没用参数绑定? |
26 rESHARP 2016-07-29 11:19:10 +08:00 MYSQL 可以给表名、列名加引号? 在 MSSQL 里不行 |
27 npc0der 2016-07-29 11:22:02 +08:00 长度超了么 替换某一个超长的字符串 逐渐减少长度试试 |
28 realpg PRO @alittletrain 把所有字段替换成 1 ,然后一个一个改回正常值 看看哪个字段报错呗 而且 PDO 的 execute 有返回值有错误打印 干吗不用 |
29 yao978318542 2016-07-29 11:35:07 +08:00 这个问题貌似我遇到过 你用的什么框架 exec 这个方法是 php 本身的那个 还是你自定义的? 估计是 exec 出问题了 |
31 bugsnail 2016-07-29 12:06:29 +08:00 把 SQL 语句放到数据库执行一下, 加一句: show warnings; SQL 语句; 看有没有警告, 如果没有, 那最大可能是那个 url |
32 kookxiang 2016-07-29 12:34:02 +08:00 这是 PDO 一个超级坑爹的地方…… 加上 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 然后你应该就知道哪里有问题了 |
33 JulyXing 2016-07-29 14:02:26 +08:00 pdo 默认会把 单引号转义变成 \' ,所以会出现在 php 中执行没有结果,但是单独在 mysql 中有效。这个问题前段时间也遇到过,可以去看 mysql 日志就可以看到实际执行语句。 |
34 void1900 2016-07-29 14:05:41 +08:00 没错误提示? 长度问题吧 我猜 |
36 aprikyblue 2016-07-29 14:20:03 +08:00 用 pdo 干嘛还拼接。。 |
37 alittletrain OP @iyaozhen exec 返回 false |
38 alittletrain OP @void1900 长度没问题 字段类型没问题 手动 mysql insert OK |
40 macroideal 2016-07-29 14:48:39 +08:00 报什么错 |
41 laobaozi 2016-07-29 15:22:59 +08:00 echo 出这个 sql 语句,用 echo 的输出再在 mysql 中直接执行 |
42 astome 2016-07-29 15:42:39 +08:00 看看字段设置的长度够不够 |
43 caoyujia2000 2016-07-29 16:39:17 +08:00 建议把插入的字段删除一些,执行成功后,再把删除的字段加进去,便于精确定位出错的地方 |
44 nightspirit 2016-07-29 16:56:16 +08:00 mysql error 有没有 |
45 hcymk2 2016-07-29 17:00:57 +08:00 开 mysql 的 general_log |
46 RIcter 2016-07-29 17:10:51 +08:00 -。- lz 你看一下我说的话,我踩过这个坑。 你 insert 的 table 里应该有不能为 NULL 的字段但是你 insert 的语句里没有写。 |
47 annielong 2016-07-29 17:32:46 +08:00 应该是编码问题,很有可能是那个 url ,实际上一个字段一个字段的替换成 1 执行就知道了 |
48 williamx 2016-07-29 18:39:40 +08:00 你把表结构也一起发出来不就很快就帮你搞定了? |
49 pengfei 2016-07-30 00:10:26 +08:00 java 有没提交事务这一说 |
50 alittletrain OP @RIcter 把 VALUE 都换成 1 就可以正确插入 |