【问题标题】:Can't connect to MySQL server with PDO [duplicate]无法使用 PDO 连接到 MySQL 服务器 [重复]
【发布时间】:2015-07-19 18:13:57
【问题描述】:

我正在尝试使用 PDO 防止 SQL 注入,但我似乎无法连接。这是工作版本 - 不是 SQL 注入安全的:

<html>
    <head>
    <title>Insert data into database</title>
    </head>
    <body>
    <?php


    session_start();
    $_SESSION['name'] = $_POST['name'];

    // Connect to database server
    mysql_connect("localhost", "********", "********") or die(mysql_error());

    // Select database
    mysql_select_db("mydatabase") or die(mysql_error());

    // The SQL statement is built

    $strSQL = "INSERT INTO mytable(name) VALUES('" . $_POST["name"] . "')";

    // The SQL statement is executed 
    mysql_query($strSQL) or die (mysql_error());



    // Close the database connection
    mysql_close();

    echo "Your name is " . $_POST["name"] ; 

    ?>

    </body>
    </html>

这工作得很好。我阅读了这些关于如何使用 PDO 来防止 SQL 注入攻击的页面:

http://www.w3schools.com/php/php_mysql_connect.asp

http://www.w3schools.com/sql/sql_injection.asp

并按照指南编写以下代码:

<html>
    <head>
    <title>Insert data into database</title>
    </head>
    <body>
    <?php


    session_start();
    $_SESSION['name'] = $_POST['name'];

    $servername = "localhost";
    $username = "********";
    $password = "********";

    try {
        $conn = new PDO("mysql:host=$servername, dbname=mydatabase", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "Connected successfully";
        }
    catch(PDOException $e)
        {
        echo "Connection failed: " . $e->getMessage();
        }

    echo "You have connected to the database server with PDO"

    // The SQL statement is built
    $stmt = $dbh->prepare("INSERT INTO mytable (name)
    VALUES (:name)");
    $stmt->bindParam(':name', $_POST['name']);
    $stmt->execute();


    // Close the database connection
    mysql_close();

    echo "Your name is " . $_POST["name"] ; 

    ?>

    </body>
    </html>

但是这段代码只是给了我一个空白页——没有错误信息,也没有任何东西插入数据库。

我还尝试按照

中的说明进行连接

http://www.stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php

但结果是一样的 - 一个没有错误消息的空白页面。

我做错了什么?

【问题讨论】:

  • 您的 http 服务器错误日志文件说明了什么?这应该始终是要查看的第一个位置。那是 php 记录错误的地方。 读取错误。修复问题。
  • @PeeHaa 副本在哪里?我同意有一些类似的,例如 stackoverflow.com/questions/15128468/… ,由于过于本地化而被关闭,这显然与我的问题不同。如果我的答案已经得到解答,我很想看到答案,但我搜索没有成功。
  • @arkascha 我不知道存在诸如服务器错误日志文件之类的东西。我在哪里可以找到它?
  • 如果您在 PHP 中遇到 WSOD(白屏死机),您必须启用错误报告,这样您才能看到您的错误是什么。因此被骗了。
  • 您的代码中充满了错误,错误报告会告诉您这种情况以及具体的错误。

标签: php mysql pdo


【解决方案1】:

您为 $stmt = $dbh-&gt;prepare 使用了错误的变量

根据您的连接,应该是 $conn 而不是 $dbh

如果使用了错误报告,则会对未定义的变量 dbh 通知/警告进行签名。

您也不能将mysql_close(); 与 PDO 一起使用,因为您正在混合 API,这是您无法做到的。

参见手册http://php.net/manual/en/pdo.connections.php中“连接和连接”的示例#3关闭连接

另一件事session_start(); 最好高于一切。您可能在标题之前输出。

编辑:您在这一行中忘记了分号:

echo "You have connected to the database server with PDO"

应该读作

echo "You have connected to the database server with PDO";

这会破坏你的代码。

错误报告也会捕获该语法/解析错误。

error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告应该只在暂存阶段完成,而不是在生产阶段。

【讨论】:

  • 我现在已更改为$stmt = $conn-&gt;prepare 并删除了mysql_close();。我已将session_start(); 移动到标题上方,并根据链接中的示例在末尾添加了$conn = null;。我很感激你的建议!尽管如此,我仍然有同样的问题。
  • @anvandarnamn 你在哪里有echo "Your name is " . $_POST["name"] ; 它有什么回声吗?
  • @anvandarnamn 我还注意到了其他东西,echo "You have connected to the database server with PDO" 中缺少一个分号,我将其添加到我的答案中。我现在才注意到。这会破坏你的代码。
  • 它正在工作。当我按照您的建议在 echo 语句后添加分号时,我收到一条错误消息,让我意识到 "mysql:host=$servername;dbname=mydatabase" 是正确的连接方式。感谢您对像我这样凌乱的头脑有耐心!
  • @anvandarnamn 非常欢迎你,我很高兴能帮到你,干杯
猜你喜欢
  • 2012-05-21
  • 2013-02-14
  • 1970-01-01
  • 2019-10-30
  • 2016-01-10
  • 1970-01-01
  • 2022-01-18
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多