在PHP 4中,您可以将表单输入MySQL数据库,如下所示:
<form action="script.php" method="post">
<fieldset>
<input id="name" name="name" type="text" placeholder="Insert your name" />
<input type="submit" value="Opslaan" />
</fieldset>
</form>
的script.php:
$name= $_POST['name'];
$name = stripslashes($name);
$name = mysql_real_escape_string($name);
mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query = "INSERT INTO names (id, name) VALUES ('','$name')";
mysql_query($query);
mysql_close();
现在PHP 5已经出来了,使用PDO的最新标准将这个表单放在MySQL数据库中的正确表示法是什么?
答案 0 :(得分:1)
这或多或少是使用PDO运行更新的最简单方法:
// database connection
$conn = new PDO("mysql:host=localhost;dbname=MyDBName",aDBUser,aDBPassword);
// Disable emulated prepared statements
// PDO will **TRY** to use real (non-emaulated) prepared statements
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Some sample data
$aTitle = 'PHP Security';
$anAuthor = 'John Doe';
// Prepare a statement with some placeholders prefixed by ':'
$sql = "INSERT "
. " INTO books "
. " ( title, author ) "
. "VALUES ( :title, :author )"
;
$q = $conn->prepare($sql);
// Execute the prepared statement and replace placeholders by values
$q->execute(array(':author' => $anAuthor,
':title' => $aTitle
)
);
此外,您可能希望查看OWASP的PHP Security Cheat Sheet。
安全考虑
如果数据库驱动程序无法使用本机预处理语句,则它会回退到模拟的预准备语句(可能不太安全)。来自docs:
PDO :: ATTR_EMULATE_PREPARES 启用或禁用已准备好的模拟 声明。某些驱动程序不支持本机预处理语句或 对他们的支持有限。使用此设置可以强制PDO 始终模拟预准备语句(如果为TRUE),或尝试使用本机语句 准备好的陈述(如果为FALSE)。 将始终回归模拟 准备好的声明,如果驱动程序无法成功准备 当前查询。需要布尔。
答案 1 :(得分:-1)
尝试以下方法:
$mysqlconn= new PDO('mysql:dbname=' .$database . ';host=' . $host, $username, $password);
$query = "INSERT INTO names (id, name) VALUES (:id,:name)";
$statement=$mysqlconn->prepare($query);
$statement->execute(array(':id'=>null,':name'=>$name));
这是移植到PDO的逻辑的核心。你必须填补缺失的部分。