【发布时间】: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,对吧?我在考虑交易。