我试图使用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
但结果是一样的 - 没有错误消息的空白页。
我做错了什么?
答案 0 :(得分:1)
您正在使用$stmt = $dbh->prepare
应该是$conn
而不是$dbh
。
使用错误报告后,可能会签署一个未定义的变量dbh notice / warning。
在您混合使用API时,您也无法将mysql_close();
用于PDO。
参见示例#3关闭&#34;连接和连接&#34;的连接;在手册http://php.net/manual/en/pdo.connections.php
中另一件事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
旁注:错误报告应仅在暂存时完成,而不是生产。