【问题标题】:Why is this PHP-PDO script failing to connect to MySQL server on localhost?为什么这个 PHP-PDO 脚本无法连接到本地主机上的 MySQL 服务器?
【发布时间】:2016-06-01 22:19:41
【问题描述】:

Ubuntu 14.04、MySQL 5.5、PHP5、PHP5-mysql - Ubuntu 14.04 发行版之外没有任何内容 - 这是错误和代码:

SQLSTATE[HY000] [2005] 未知的 MySQL 服务器主机 '(localhost)' (11)

<?php
$db_host='localhost';
$db_name='my_guitar_shop2';
$db_user='included';
$db_pass='included';

try {
    $conn = new PDO("mysql:host=($db_host);dbname=($db_name)", $db_user, $db_pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $query = $conn->query('SELECT * FROM products');

    while($row = $query->fetch(PDO::FETCH_OBJ)) {
        $results[] = $row;
    }

    print r($results);
} catch(PDOException $e) {
    echo 'ERROR : ' . $e->getMessage();
    }
?>

代码的 MySQLi 版本(未显示) - 从 MySQL 数据库返回数据。此 PHP-PDO 版本的代码返回错误。我已经替换了循环地址、我的 PC 的 IP 以及各种组合。到目前为止,只有 MySQLi 有效。我希望能够使用 PDO。脚本中有错误吗?有什么问题?

这个应用程序将我的 cmets 限制为 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 工作,所以我去掉了错误检查。再次感谢您的回复。

【问题讨论】:

  • 您需要在 PDO 声明中写 {$db_host},而不是 ($db_host)(与 db_name 相同)。
  • 为什么还要在这种情况下使用变量呢?您不会在其他任何地方使用它们。只需使用new PDO('mysql:host=localhost;dbname=my_guitar_shop2;charset=utf8', 'included', 'included')

标签: php mysql pdo


【解决方案1】:

仔细查看错误信息:

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);

【讨论】:

    【解决方案2】:

    你为什么用这个?:

    $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);
    

    【讨论】:

      【解决方案3】:

      你的构造函数看起来不太正确,试试这个:

      $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();
      }
      

      如果仍然失败,则将带有异常文本的整个堆栈跟踪复制到您的问题。

      【讨论】:

        【解决方案4】:

        这是您可能要考虑的使用 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'];
            }
        }
        

        【讨论】:

        • 使用 localhost 将使用本地套接字连接(如果可用),这比通过 TCP 连接到 127.0.0.1 更可取
        • 拥有一个专用的 TCP 总是比环回 localhost 更可取,因为环回 localhost 无论如何都会产生 TCP 开销。
        • 要详细说明,这取决于软件及其处理方式。对于mysql,它更快,毫无疑问,如果在同一台主机上。 SQL 或 postgres,不确定...
        • 我让 PDO 转储数据库进行打印,这是我主要关心的问题。我接近 PHP 的第一天,以及 db 的第 20 年 - 所以从这里开始学习 PHP-MySQL 应该是一件轻而易举的事。非常感谢您的帮助。
        猜你喜欢
        • 2012-04-02
        • 2015-08-23
        • 2022-12-14
        • 1970-01-01
        • 2013-04-22
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        相关资源
        最近更新 更多