-5

在 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>​    

脚本.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 数据库的正确表示法是什么?

4

2 回答 2

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

此外,您可能希望查看OWASPPHP 安全备忘单

安全考虑

如果 DB 驱动程序无法使用本机预准备语句,它会退回到模拟预准备语句(这可能不太安全)。从文档

PDO::ATTR_EMULATE_PREPARES启用或禁用准备语句的模拟。一些驱动程序不支持本机准备语句或对它们的支持有限。使用此设置可强制 PDO 始终模拟预准备语句(如果为 TRUE),或尝试使用本机预准备语句(如果为 FALSE)。如果驱动程序无法成功准备当前查询,它将始终回退到模拟 准备好的语句。需要布尔值。

于 2013-08-30T23:58:06.250 回答
-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 的逻辑的核心。你必须填补缺失的部分。

于 2013-08-30T23:59:58.320 回答