V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
alittletrain
V2EX  ›  PHP

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

  •  
  •   alittletrain · Jul 29, 2016 · 7880 views
    This topic created in 3559 days ago, the information mentioned may be changed or developed.

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

    Supplement 1  ·  Jul 29, 2016
    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', '医院')");
    
    
    
    Supplement 2  ·  Jul 29, 2016
    1. 长度没问题 手动插入长度可以保存
    2. 现在依然没解决。。。
    Supplement 3  ·  Jul 31, 2016

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

    没说用 orm 啊

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

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

    看有没有警告,

    如果没有, 那最大可能是那个 url
    kookxiang
        32
    kookxiang  
       Jul 29, 2016
    这是 PDO 一个超级坑爹的地方……

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

    你 insert 的 table 里应该有不能为 NULL 的字段但是你 insert 的语句里没有写。
    annielong
        47
    annielong  
       Jul 29, 2016
    应该是编码问题,很有可能是那个 url ,实际上一个字段一个字段的替换成 1 执行就知道了
    williamx
        48
    williamx  
       Jul 29, 2016
    你把表结构也一起发出来不就很快就帮你搞定了?
    pengfei
        49
    pengfei  
       Jul 30, 2016
    java 有没提交事务这一说
    alittletrain
        50
    alittletrain  
    OP
       Jul 31, 2016
    @RIcter 把 VALUE 都换成 1 就可以正确插入
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3204 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 132ms · UTC 00:03 · PVG 08:03 · LAX 17:03 · JFK 20:03
    ♥ Do have faith in what you're doing.