alittletrain
V2EX  ›  PHP

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

  •  
  •   alittletrain · Jul 29, 2016 · 8378 views
    This topic created in 3754 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_mode的STRICT_TRANS_TABLES删掉,然后重启mysql容器,插入成功。

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

    没说用 orm 啊

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

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

    看有没有警告,

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

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

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