为什么这个PHP-PDO脚本无法连接到本地主机上的MySQL服务器?
Ubuntu 14.04、MySQL 5.5、PHP5、PHP5 MySQL-在Ubuntu 14.04发行版之外没有其他版本-以下是错误和代码: SQLSTATE[HY000][2005]未知MySQL服务器主机“localhost”11 未显示代码的MySQLi版本-从MySQL数据库返回数据。此PHP-PDO版本的代码返回错误。我已经替换了循环地址、PC的IP以及各种组合。到目前为止,只有MySQLi可以工作。我希望能够使用PDO。脚本中有错误吗?有什么不对劲吗 这个应用程序将我的评论限制为180个字符,我不知道如何用更多的代码来回应,所以我正在编辑这个问题。对不起我的无知 这就是我最终得到的效果:为什么这个PHP-PDO脚本无法连接到本地主机上的MySQL服务器?,php,mysql,pdo,Php,Mysql,Pdo,Ubuntu 14.04、MySQL 5.5、PHP5、PHP5 MySQL-在Ubuntu 14.04发行版之外没有其他版本-以下是错误和代码: SQLSTATE[HY000][2005]未知MySQL服务器主机“localhost”11 未显示代码的MySQLi版本-从MySQL数据库返回数据。此PHP-PDO版本的代码返回错误。我已经替换了循环地址、PC的IP以及各种组合。到目前为止,只有MySQLi可以工作。我希望能够使用PDO。脚本中有错误吗?有什么不对劲吗 这个应用程序将我的评论限制
<?php
define("SQLHOST", "localhost");
define("SQLUSER", "included");
define("SQLPASS", "included");
define("SQLSGBD", "my_guitar_shop2");
$pdo = new PDO('mysql:host=' . SQLHOST . ';dbname=' . SQLSGBD . ';charset=UTF8', SQLUSER, SQLPASS);
if ($pdo) {
$stmt = $pdo->prepare("SELECT productName, description, listPrice FROM products");
if ($stmt) {
if($stmt->execute()); {
while( $row = $stmt->fetch()) {
echo "Item: " . $row['productName']."<br/>";
echo "Description: " . $row['description']."<br/>";
echo "List Price: " . $row['listPrice']."<br/>";
echo "<p> </p>";
}
}
}
}
?>
我最感兴趣的是让PDO工作,所以我去掉了错误检查。再次感谢您的回复。您的构造函数看起来不太正确,请尝试以下方法:
$dsn = 'mysql:dbname='.$db_name.';host='.$db_host;
try {
$dbh = new PDO($dsn, $db_user, $db_pass);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
如果它仍然失败,则用异常文本复制整个问题。
这是你想考虑的PDO的正确方法。 评论: 1/将localhost替换为127.0.0.1。这在任何情况下都要快得多 2/避免使用while遍历数组。foreach速度更快,专为您设计 3/在您的示例中,您在SQL中也使用了*,这被认为是错误的做法$exitOnError = true;
define("SQLHOST", "127.0.0.1");
define("SQLUSER", "login");
define("SQLPASS", "password");
define("SQLSGBD", "my_guitar_shop2");
$conn = new PDO('mysql:host=' . SQLHOST . ';dbname=' . SQLSGBD . ';charset=UTF8', SQLUSER, SQLPASS);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql1 = 'SELECT designation, price, description FROM products';
$stmt1 = $conn->prepare($sql1);
try {
$stmt1->execute();
$objs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
if ($exitOnError === true) {
var_dump("error query 1:" . __LINE__ . "-------" . __FUNCTION__ . "-------" . $e->getMessage());
exit;
}
}
if (count($objs1) !== 0) {
$pricesList=array();
foreach ($objs1 as $key1 => $result1) {
$pricesList[] = $result1['price'];
}
}
仔细查看错误消息:
SQLSTATE[HY000] [2005] Unknown MySQL server host '(localhost)'
您将看到主机名在括号中。看看代码,原因很明显
$conn = new PDO("mysql:host=($db_host);dbname=($db_name)", $db_user, $db_pass);
还有括号。移除它们
$conn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
你为什么用这个
$conn = new PDO("mysql:host=($db_host);dbname=($db_name)", $db_user, $db_pass);
试着用这个代替!这应该起作用:
$conn = new PDO("mysql:host=($db_host);dbname=" . $db_name, $db_user, $db_pass);
您需要在PDO声明中写入{$db_host},而不是$db_host,并且与db_name相同。在这种情况下,为什么还要麻烦使用变量呢?你不会在其他任何地方使用它们。只需使用新的PDO'mysql:host=localhost;dbname=我的吉他店2;charset=utf8,“included”,“included”使用本地主机将使用本地套接字连接(如果可用),这比通过TCP连接到127.0.0.1要好得多。拥有专用TCP始终比环回本地主机更可取,后者无论如何都会产生TCP开销。更详细地说,这取决于软件及其处理方式。对于mysql来说,如果在同一台主机上,速度会更快,这一点毫无疑问。SQL或postgres,不确定……我让PDO转储数据库以打印,这是我主要关心的问题。我即将进入PHP的第一天和db的第20年,所以从现在开始学习PHP MySQL应该是一件轻而易举的事。非常感谢你的帮助。
$conn = new PDO("mysql:host=($db_host);dbname=" . $db_name, $db_user, $db_pass);