我之前已经看到过这个问题的答案,但没有我可以应用的解决方案。我正在通过Chrome进行本地测试(Apache)(这可能是罪魁祸首吗?),没办法,无法让它运行起来。将我的代码剥离到最低限度。这是PHP代码:
$host = 'localhost';
$user = 'root';
$pass = 'pippo';
$database = 'test';
//this is optional, removing it doesn't change anything
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false);
$pdo = new PDO("mysql:host=$host;dbname=$database", $user, $pass, $options);
$sql = "INSERT INTO user (`username`, `dob`) VALUES ('wallyxx', '458')";
$statement = $pdo->prepare($sql);
$inserted = $statement->execute();
if($inserted){echo 'Row inserted!<br>';}
这里出了什么问题?有人可以帮忙吗? 谢谢你的帮助。罗伯特
更新:我注意到如果我进入数据库管理器(adminer)并删除一些记录,下次我运行teh片段时,我会得到一条记录。这是我不知道的某种HTTP问题吗?
答案 0 :(得分:1)
删除
$inserted = $statement->execute();
if($inserted){echo 'Row inserted!<br>';}
添加:
if($statement->execute()){echo 'Row inserted!<br>';}
删除此:
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false);
替换为
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, )
答案 1 :(得分:0)
你的剧本没有错。
即使最后一个条件是写,因为$statement->execute()
将根据文档http://php.net/manual/en/pdostatement.execute.php
检查您的申请并确保您不会多次包含相同的脚本。使用require_once
代替require
和include_once
代替include
。
我还建议将此脚本放在偶数类的函数中。如果你不知道怎么做,这个tutorial是一个好的开始(它是用mysqli写的,但它可以添加到pdo)。更好的是,如果您正在使用作曲家,那么您应该随意使用此存储库,这将简化您的一切https://bitbucket.org/kisphp/kisphp-database.git
答案 2 :(得分:0)
谢谢大家,我测试了你的想法但没有改变。 但显然问题只出现在本地服务器上。 我把所有东西放在“真正的服务器”上,事情似乎很顺利。仅排了一排,测试了很多。 如果我将找出Apache的这种奇怪行为的原因,我将发布调查结果。现在我注意到,有时第二次调用是在短暂的延迟之后发生的,所以必须在我的本地服务器中循环...谁知道。 就目前而言,由于似乎“在现实世界中”任何时候都只记录了一行,我正在追寻其他问题,并将其视为“已解决”。感谢所有投入时间努力帮助的人。 罗伯特