我被一个简单的 php 搞了 2 天,马上崩溃 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
alittletrain
V2EX    PHP

我被一个简单的 php 搞了 2 天,马上崩溃

  •  
  •   alittletrain 2016-07-29 09:24:24 +08:00 7675 次点击
    这是一个创建于 3410 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一条 pdo 的 insert into 语句,拿出来放到 mysql 执行就 OK ,放到 php 里就不行,求可能的原因。。。

    第 1 条附言    2016-07-29 10:04:22 +08:00
    1. 没有连错库
    2. 把VALUES的值都换成1就可以正常插入
    3. php没有报错
    4. 代码如下:
     $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', '医院')"); 
    第 2 条附言    2016-07-29 14:30:42 +08:00
    1. 长度没问题 手动插入长度可以保存
    2. 现在依然没解决。。。
    第 3 条附言    2016-07-31 08:58:41 +08:00

    感谢各位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_modeSTRICT_TRANS_TABLES删掉,然后重启mysql容器,插入成功。

    50 条回复    2016-07-31 08:33:16 +08:00
    fuge
        1
    fuge  
       2016-07-29 09:32:26 +08:00
    我觉得把你的语句贴出来会好一点
    acking
        2
    acking  
       2016-07-29 09:34:15 +08:00
    我觉得看看 mysql log , php log ,环境 log ,比较好
    Hallujah
        3
    Hallujah  
       2016-07-29 09:36:21 +08:00 via Android
    楼主只是想吐槽几句?我觉得半天搞不定就该拿出来让大家看看。
    xiandao7997
        4
    xiandao7997  
       2016-07-29 09:38:13 +08:00
    转义字符
    rESHARP
        5
    rESHARP  
       2016-07-29 09:38:14 +08:00
    问题这样的提法,还是去问医院门口的算命先生比较合适
    young
        6
    young  
       2016-07-29 09:39:48 +08:00
    我觉得你连错库了....
    Mac
        7
    Mac  
       2016-07-29 09:41:13 +08:00
    单引号和双引号的问题?
    DT27
        8
    DT27  
       2016-07-29 09:42:58 +08:00
    php 有错误提示啊。。。
    另外一般小页面用 php 我都直接用 mysql 操作类。。。
    Xrong
        9
    Xrong  
       2016-07-29 09:47:38 +08:00
    编码问题?
    gdtv
        10
    gdtv  
       2016-07-29 09:49:17 +08:00
    看一下 pdo 最终生成的 sql 是什么
    xuhaoyangx
        11
    xuhaoyangx  
       2016-07-29 09:49:28 +08:00
    log 呢,报错的提示呢。 你需要学学如何提问
    cccRaim
        12
    cccRaim  
       2016-07-29 09:50:01 +08:00
    估计是某些非数字类型没有加单引号
    alittletrain
        13
    alittletrain  
    OP
       2016-07-29 10:04:56 +08:00
    RIcter
        14
    RIcter  
       2016-07-29 10:16:40 +08:00
    PDO 的话,有 warning 就不能成功运行。
    你在 MySQL 里运行的时候是不是不是 0 warnings ?
    DT27
        15
    DT27  
       2016-07-29 10:25:45 +08:00
    sql 语句直接 mysql_query 没问题。。。
    Mac
        16
    Mac  
       2016-07-29 10:26:06 +08:00
    用工具比如 HEIDISQL 直接运行这段 SQL 看看错在哪,可能字段类型和长度
    DT27
        17
    DT27  
       2016-07-29 10:27:29 +08:00
    楼主可以一个字段一个字段的替换看看是不是某个字段的问题。
    或者先把中文换成 1 ,其它不变。
    tojoevan
        18
    tojoevan  
       2016-07-29 10:30:31 +08:00 via iPhone
    每当遇到如此问题都推荐二分排除法把字段替换为 1 ,基本 5 分钟内,解决战斗
    DT27
        19
    DT27  
       2016-07-29 10:33:09 +08:00
    @Mac 楼主直接放到 mysql 执行没问题,说明字段类型跟长度都没问题。。。
    jarlyyn
        20
    jarlyyn  
       2016-07-29 10:38:55 +08:00
    手工拼接 sql 的勇士啊……
    alittletrain
        21
    alittletrain  
    OP
       2016-07-29 11:00:49 +08:00
    @tojoevan 替换成 1 可以插入
    alittletrain
        22
    alittletrain  
    OP
       2016-07-29 11:01:13 +08:00
    @jarlyyn 没办法 不让用 orm
    nullp
        23
    nullp  
       2016-07-29 11:05:07 +08:00
    之前遇到过这样的问题。不过是用 php 连的 mssql 打印出来的 sql 语句直接可以执行,在 php 就是不执行。 是包含汉字的字符集编码的问题 。 不过按道理 mysql 和 php 的话都是 utf-8 应该不会有这样的问题, 你可以看下
    jarlyyn
        24
    jarlyyn  
       2016-07-29 11:11:46 +08:00
    @alittletrain

    没说用 orm 啊

    用 pdo 或者其他的绑定参数的库啊……
    iyaozhen
        25
    iyaozhen  
       2016-07-29 11:19:02 +08:00 via Android
    应该是 url 那个值的问题, exec 方法有返回值的呀,判断一下呗,然后打印一下 SQL 和 error 。

    还有用了 PDO 没用参数绑定?
    rESHARP
        26
    rESHARP  
       2016-07-29 11:19:10 +08:00
    MYSQL 可以给表名、列名加引号? 在 MSSQL 里不行
    npc0der
        27
    npc0der  
       2016-07-29 11:22:02 +08:00
    长度超了么 替换某一个超长的字符串 逐渐减少长度试试
    realpg
        28
    realpg  
    PRO
       2016-07-29 11:31:59 +08:00
    @alittletrain 把所有字段替换成 1 ,然后一个一个改回正常值 看看哪个字段报错呗
    而且 PDO 的 execute 有返回值有错误打印 干吗不用
    yao978318542
        29
    yao978318542  
       2016-07-29 11:35:07 +08:00
    这个问题貌似我遇到过 你用的什么框架 exec 这个方法是 php 本身的那个 还是你自定义的? 估计是 exec 出问题了
    Mac
        30
    Mac  
       2016-07-29 12:03:07 +08:00   1
    @rESHARP 那不是引号,那是转义符,键盘 1 边上那个,用来规避 MYSQL 本身的保留字。
    bugsnail
        31
    bugsnail  
       2016-07-29 12:06:29 +08:00
    把 SQL 语句放到数据库执行一下, 加一句:
    show warnings;
    SQL 语句;

    看有没有警告,

    如果没有, 那最大可能是那个 url
    kookxiang
        32
    kookxiang  
       2016-07-29 12:34:02 +08:00
    这是 PDO 一个超级坑爹的地方……

    加上
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    然后你应该就知道哪里有问题了
    JulyXing
        33
    JulyXing  
       2016-07-29 14:02:26 +08:00
    pdo 默认会把 单引号转义变成 \' ,所以会出现在 php 中执行没有结果,但是单独在 mysql 中有效。这个问题前段时间也遇到过,可以去看 mysql 日志就可以看到实际执行语句。
    void1900
        34
    void1900  
       2016-07-29 14:05:41 +08:00
    没错误提示? 长度问题吧 我猜
    void1900
        35
    void1900  
       2016-07-29 14:05:53 +08:00
    @void1900 或者字段类型没对上,看错误
    aprikyblue
        36
    aprikyblue  
       2016-07-29 14:20:03 +08:00
    用 pdo 干嘛还拼接。。
    alittletrain
        37
    alittletrain  
    OP
       2016-07-29 14:31:09 +08:00
    @iyaozhen exec 返回 false
    alittletrain
        38
    alittletrain  
    OP
       2016-07-29 14:31:32 +08:00
    @void1900 长度没问题 字段类型没问题 手动 mysql insert OK
    vangogogo
        39
    vangogogo  
       2016-07-29 14:44:07 +08:00
    @Mac 呵呵
    macroideal
        40
    macroideal  
       2016-07-29 14:48:39 +08:00
    报什么错
    laobaozi
        41
    laobaozi  
       2016-07-29 15:22:59 +08:00
    echo 出这个 sql 语句,用 echo 的输出再在 mysql 中直接执行
    astome
        42
    astome  
       2016-07-29 15:42:39 +08:00
    看看字段设置的长度够不够
    caoyujia2000
        43
    caoyujia2000  
       2016-07-29 16:39:17 +08:00
    建议把插入的字段删除一些,执行成功后,再把删除的字段加进去,便于精确定位出错的地方
    nightspirit
        44
    nightspirit  
       2016-07-29 16:56:16 +08:00
    mysql error 有没有
    hcymk2
        45
    hcymk2  
       2016-07-29 17:00:57 +08:00
    开 mysql 的 general_log
    RIcter
        46
    RIcter  
       2016-07-29 17:10:51 +08:00
    -。- lz 你看一下我说的话,我踩过这个坑。

    你 insert 的 table 里应该有不能为 NULL 的字段但是你 insert 的语句里没有写。
    annielong
        47
    annielong  
       2016-07-29 17:32:46 +08:00
    应该是编码问题,很有可能是那个 url ,实际上一个字段一个字段的替换成 1 执行就知道了
    williamx
        48
    williamx  
       2016-07-29 18:39:40 +08:00
    你把表结构也一起发出来不就很快就帮你搞定了?
    pengfei
        49
    pengfei  
       2016-07-30 00:10:26 +08:00
    java 有没提交事务这一说
    alittletrain
        50
    alittletrain  
    OP
       2016-07-31 08:33:16 +08:00
    @RIcter 把 VALUE 都换成 1 就可以正确插入
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2225 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:04 PVG 09:04 LAX 17:04 JFK 20:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86