关于php:无法使用PDO连接到MySQL服务器

Can't connect to MySQL server with PDO

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<html>
    <head>
    Insert data into database
    </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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<html>
    <head>
    Insert data into database
    </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

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

我究竟做错了什么?


你正在为$stmt = $dbh->prepare使用错误的变量

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

使用错误报告后,将签署一个未定义的变量dbh notice / warning。

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

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

另一件事session_start();最好超越任何东西。您可能在标题之前输出。

编辑:你在这一行忘记了一个分号:

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

应该读作

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

这会打破你的代码。

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

  • http://php.net/manual/en/function.error-reporting.php

将错误报告添加到文件的顶部,这将有助于查找错误。

1
2
3
4
5
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

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