PHP使用PDO将数据插入MySQL数据库的代码无法工作

8
我是一个有用的助手,可以翻译文本。
我有困难解决一些简单的PHP代码,将记录插入MySQL表中。
这段代码直接输入WAMP中可以正常工作:
INSERT INTO `users` (`userName`,`userEmail`) VALUES ('orange','orange@gmail.com')

这段PHP代码无法工作:
<?php
    $dbHost="localhost";
    $dbName="project";
    $dbUser="admin";
    $dbPassword="abcd";
    $dbh=new PDO("mysql:host=$dbHost;dbName=$dbName", $dbUser, $dbPassword);
    print_r($dbh);
    echo "</br>";
    print_r($dbh->errorInfo());

    $query=$dbh->prepare("INSERT INTO users (userName, userEmail) VALUES (?,?)");
    echo "</br>";
    print_r(var_dump($query->errorInfo()));
    echo "</br>";
    print_r($query->errorCode());
    echo "</br>";
    print_r($dbh->errorInfo());

    $query->bindValue(1, 'apple');
    echo "</br>";
    print_r(var_dump($query->errorInfo()));
    echo "</br>";
    print_r($query->errorCode());
    echo "</br>";
    print_r($dbh->errorInfo());

    $query->bindValue(2, 'apple@gmail.com');
    echo "</br>";
    print_r(var_dump($query->errorInfo()));
    echo "</br>";
    print_r($query->errorCode());
    echo "</br>";
    print_r($dbh->errorInfo());

    $inserted=$query->execute(); //True if succesful, False if not.
    echo "</br>";
    print_r(var_dump($query->errorInfo()));
    echo "</br>";
    print_r($query->errorCode());
    echo "</br>";
    print_r($dbh->errorInfo());
    echo "</br>";
    if ($inserted){print_r("true");}else{print_r("false");};
?>

当我执行该页面时,我得到的输出如下所示:
PDO Object ( )
Array ( [0] => [1] => [2] => )
array(3) { [0]=> string(0) "" [1]=> NULL [2]=> NULL }

Array ( [0] => 00000 [1] => [2] => )
array(3) { [0]=> string(0) "" [1]=> NULL [2]=> NULL }

Array ( [0] => 00000 [1] => [2] => )
array(3) { [0]=> string(0) "" [1]=> NULL [2]=> NULL }

Array ( [0] => 00000 [1] => [2] => )
array(3) { [0]=> string(5) "3D000" [1]=> int(1046) [2]=> string(20) "No database selected" }
3D000
Array ( [0] => 00000 [1] => [2] => )
false

记录没有被插入到数据库中。我做错了什么?我不确定在print_r中应该看到什么,我提供它们作为响应者的帮助。
谢谢,
JDelage 编辑 - 我添加了评论中推荐的print_r。
这是我在WAMP中看到的:


4
在连接和查询后,您可以尝试运行 print_r($dbh->errorInfo());。这将提供一些有用的调试信息。 - lonesomeday
1
在这里,你需要做的不是所有的打印语句,而是要检查$query的错误状态,使用var_dump($query->errorInfo());并检查$query->errorCode() - Michael Berkowski
2
如果您的数据库名称确实是project,那么我看到的唯一奇怪的事情是mysql:host=$dbHost;dbName=$dbName。我无法想象它可能是问题,但是如果您将其更改为mysql:host=$dbHost;dbname=$dbName(请注意dbname全部小写),您是否有相同的结果? - jeroen
2
你可以在连接到数据库后立即调用 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。这样脚本会在出现错误时立即抛出异常。然后你可以使用 try { .. }catch (Exception $e) { echo $e->getMessage(); } 来查看发生了什么。 - Dan Soap
使用命名参数时,您是否获得相同的结果?尝试将PDO连接设置为抛出异常,看看是否会有任何结果。 - Nev Stokes
显示剩余6条评论
2个回答

4

这个错误信息似乎表明你已经成功连接到了数据库,但是项目数据库尚未被选择。

为了确保它正在使用正确的 DSN 进行连接,我建议尝试更改连接字符串以直接包含值,而不是变量,例如:

'mysql:host=localhost;dbname=project'

虽然这不应该有影响,但还是值得检查一下。

如果那样做还是不行的话,既然你似乎能够连接到MySQL,一个解决方法是将数据库名称作为查询的一部分。所以你上面的查询将变成:

$query=$dbh->prepare("INSERT INTO project.users (userName, userEmail) VALUES (?,?)");

将“INSERT INTO users…”替换为“INSERT INTO project.users…”是可行的。谢谢 - 但我必须说我仍然不理解问题... - JDelage

1
非常奇怪的问题,似乎需要小写输入dbname才能正确连接到数据库。
所以应该是:
mysql:host=$dbHost;dbname=$dbName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接