V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
alittletrain
V2EX  ›  PHP

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

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

    有一条 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  
       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   ·   实用小工具   ·   5684 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:04 · PVG 17:04 · LAX 01:04 · JFK 04:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.