Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个PHP-PDO脚本无法连接到本地主机上的MySQL服务器?_Php_Mysql_Pdo - Fatal编程技术网

为什么这个PHP-PDO脚本无法连接到本地主机上的MySQL服务器?

为什么这个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。脚本中有错误吗?有什么不对劲吗 这个应用程序将我的评论限制

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

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>&nbsp;</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);