【发布时间】:2010-09-15 11:21:57
【问题描述】:
我正在努力理解准备好的陈述。
基本上,我会像往常一样进行插入:
$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() 之类的东西来使用上述准备好的语句吗?
【问题讨论】:
-
除了一些依赖于应用程序的检查(强制名称不为空等)之外,它似乎还可以,就像在 SQL 注入安全中一样。请记住,您也可以放弃
->bindParam()电话,而只需拨打$dbh->execute($_POST); -
+1 - 这样的问题再次证明了我对开发人员的信心。通常人们对他们的内联 SQL 连接非常防御。
-
他们相当于我。仅供参考:PreparedStatements 不能帮助 IN 子句的动态参数 - 必须作为动态 SQL 完成。
标签: php mysql prepared-statement