如何将以下INSERT转换为准备好的语句以使其安全?

时间:2010-09-15 00:28:54

标签: php mysql prepared-statement

我正试着准备好陈述。

基本上,我会像往常一样进行插入:

$sql = '
    INSERT INTO customers 
      (customer_first, customer_last, customer_address, customer_email)
    VALUES
      (' . mysql_real_escape_string($_POST['customer_first']) . ', 
      ' . mysql_real_escape_string($_POST['customer_last']) . ', 
      ' . mysql_real_escape_string($_POST['customer_address']) . ', 
      ' . mysql_real_escape_string($_POST['customer_email']) . '  )  
  ';
  mysql_query($sql);

据我所知,有一种更安全的方法可以使用预备语句来做到这一点。

到目前为止,我认为它是这样完成的:

$stmt = $dbh->prepare("INSERT INTO customers (customer_first, customer_last, customer_address, customer_email) VALUES (:customer_first, :customer_last, :customer_address, :customer_email)");
$stmt->bindParam(':customer_first', $_POST['customer_first']);
$stmt->bindParam(':customer_last', $_POST['customer_last']);
$stmt->bindParam(':customer_address', $_POST['customer_address']);
$stmt->bindParam(':customer_email', $_POST['customer_email']);

$stmt->execute();

这是对的吗?或者有更好的方法来做我想要实现的目标吗?如果我尝试以上操作,我会收到错误“在非对象上调用成员函数prepare()” - 这是什么意思?

我正在使用示例@ http://php.net/manual/en/pdo.prepared-statements.php。它指的是$ dbh - 它从哪里得到的?是否应该在其他地方引用$ dbh - 我假设它与数据库连接有关?

除了这些问题之外,我还可以使用像上面这样的预处理语句来使用mysql_insert_id()或mysql_error()之类的东西吗?

2 个答案:

答案 0 :(得分:1)

如果您不熟悉OOP,可以从mysqli开始,以获得更加熟悉的功能和语法以及对函数式编程的支持,但如果您准备好处理OOP,则值得查看PDO class

值得回顾以帮助决定从哪里开始:mysqli or PDO - what are the pros and cons?

  

它指的是$ dbh - 它在哪里   得到的?是$ dbh应该是   别处引用 - 我假设它   与数据库有关   连接?

$ dbh =数据库句柄(在PDO > Connections and Connection Management doc中定义)

  

我还可以使用像   mysql_insert_id()或mysql_error()   使用上面准备好的陈述?

PDO::lastInsertIdPDO::errorInfo

答案 1 :(得分:1)

错误消息表明您的问题出在$dbh对象上 - 它是如何初始化的?