我执行两个查询一个接一个:一个是INSERT另一个是SELECT,它选择插入的行。 虽然行已成功插入(我可以在数据库中看到它),但是select查询无法返回该行。
当我再次执行SELECT查询时,它会返回正确的结果。
插入
$stmt = $pdo->prepare('INSERT INTO user (id ,name, lastname ,birthday, social_type, social_id) VALUES(NULL, :name, :lastname, :birthday, :social_type, :social_id)');
$success=$stmt->execute(array(
':name' => $user['name'],
':lastname' => $user['lastname'],
':birthday' => $user['birthday'],
':social_type' => $user['social_type'],
':social_id' => $user['social_id']
));
选择
$stmt = $pdo->prepare('SELECT * FROM user WHERE social_id = :social_id AND social_type = :social_type LIMIT 1');
$stmt->execute(array(
'social_id' => $user['social_id'],
'social_type' => $user['social_type'] ));
$result = $stmt->fetch(PDO::FETCH_ASSOC);
答案 0 :(得分:2)
如果您正在使用INNODB:
如果您正在使用INNODB,因为您确认已插入行,它应该是 只要SELECT查询实际行的键,就返回SELECT 已插入。 (你确定你没有使用像INSERT DELAYED这样的功能吗?那个 可能会阻止该行返回。)
如果您使用MYISAM:
由于MyISAM不支持事务,SELECT应该返回插入,但是我 找不到任何说明这实际上有保证的东西。
注意:下面列出的第一个URL表明您使用的是MYISAM(根据此链接的默认值), INSERTS将锁定表格。但是,第二个URL指出插入的锁是一个可读锁,因此不应该阻止读取表。
http://www.sitepoint.com/mysql-mistakes-php-developers/
http://aarklondatabasetrivia.blogspot.com/2009/04/how-to-lock-and-unlock-tables-in-mysql.html
如果您正在使用INNODB(续):
您确定第一次执行的SELECT查询是否相同 作为第二次的那个?
您确定$user['social_id']
之后的值是否相同
INSERT和SELECT时的时间?
http://blogs.innodb.com/wp/2011/04/get-started-with-innodb-memcached-daemon-plugin/
陈述“你需要做”读取未提交的“选择以找到刚刚插入的行:”
即。 set session TRANSACTION ISOLATION LEVEL read uncommitted;
http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html
(此功能可能取决于使用的MYSQL版本)
<小时/>
注意: 根据此URL,如果您已启动一个事务,则选择所选行 显示在下一个SELECT语句中(不在PHP中):
http://zetcode.com/databases/mysqltutorial/transactions/
此声明暗示如果您开始交易,则不需要 设置AUTOCOMMIT:
“MySQL还会自动提交不属于交易的语句。”
此URL描述了如何在PHP中启动事务: