mysql准备好的语句在新机器上静默失败

Posted

技术标签:

【中文标题】mysql准备好的语句在新机器上静默失败【英文标题】:mysql prepared statement failing silently in a new machine 【发布时间】:2014-05-26 17:54:53 【问题描述】:

我已将网络服务器从 Ubuntu 机器移至 Mac OS X 机器,包括数据库。但是,令我惊讶的是,在执行插入的原始服务器中运行良好的准备好的语句不再起作用。

$stmt->execute(); 不返回 false,所以一切似乎都正常,但我不能 查看插入到数据库中的新数据。

php 错误日志显示没有问题。

我检查了权限,一切看起来都不错。

是否需要以某种特定方式启用准备好的语句?如何检查它们是否成功?

我与服务器的连接是在同一台机器上的 localhost 完成的。

[编辑] 启用通用日志后,我可以看到:

tail -f /var/log/apache2/error_log_mysql

/usr/local/mysql/bin/mysqld, Version: 5.6.17-log (MySQL Community Server (GPL)).     started 
with:

Tcp port: 0  Unix socket: (null)

Time                 Id Command    Argument
140526 13:36:28     3 Connect   root@localhost on database
                    3 Prepare   select * from `users` where email_addr=?
                    3 Execute   select * from `users` where email_addr='daorejw@ijaod.com'
                    3 Close stmt
                    3 Quit
                    4 Connect   root@localhost on database
                    4 Prepare   insert into `users` (first_name,last_name,password,email_addr,country,zip_code,company_name) VALUES(?,?,?,?,?,?,?)
                    4 Quit

我怀疑端口为 0 和套接字 Null,以及准备后似乎没有执行的事实。就 php 而言,我确实有 execute(),但有趣的是,它似乎在准备后没有出现。

$sql="insert into `users` (first_name,last_name,password,email_addr,country,zip_code,company_name,a, t)
    VALUES(?,?,?,?,?,?,?,0,?)";

    $stmt = $conn->prepare($sql);
    $stmt->bind_param('ssssssss', $p_firstname,$p_lastname,$p_password_hash,$p_emailaddr,$p_countryname,$p_zcode,$p_companyname,$t);
    $stmt->execute();

    if($stmt == false)
    
        error_log("SQL Failed", 0);
        die('Error: ' . mysqli_error($conn));
        echo "Error adding record</br>";
    
    else
    
                   // This part executes successfully.
            

【问题讨论】:

再次检查您的应用程序是否仍在向旧机器插入数据。 :-) 认为这是一个有趣的观察,旧服务器离线。 您可以启用general-log 并观察SQL 语句的PREPARE 和EXECUTE。准备好的语句应该可以工作,没有配置来启用或禁用它们。 能否提供更多代码?至少这两个调用与 db 相关的部分 表(和数据库)仍然是 InnoDB 吗? InnoDB 引擎是否处于活动状态?哦等等,语句不需要 InnoDB,对吧?我在考虑交易。 【参考方案1】:

我的猜测是绑定有问题。尝试打印您绑定的所有变量,看看值是否符合您的预期。

【讨论】:

即使是这样,我希望执行应该显示,即使数据错误。 尝试设置mysqli_report(MYSQLI_REPORT_ALL);在这段代码之前。我读到没有它错误处理是不同的 看起来我们走在了正确的轨道上。添加这个向我展示了一个未处理的异常,该异常与缺少其中一个字段的默认值有关。我会尝试修复它,看看。 如果您的旧服务器在全局设置中有效,可能会在全局设置中设置不同的报告选项 修复了它。其中一个字段需要默认值。也许这与我之前运行的其他版本有所不同。基本上我必须将 0 设置为绑定中的一个字段。

以上是关于mysql准备好的语句在新机器上静默失败的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱 MySQL 错误“需要重新准备准备好的语句”

准备好的语句何时失败?

SQLITE JDBC 驱动程序准备好的语句失败(内部指针 0)

准备好的语句失败(带有错误消息!)

“没有这样的模块:AVFAudio”xcode 构建在旧机器上失败,但在新机器上工作正常

CREATE TABLE 语句在 executeBatch 下静默失败