foreach ($values as $key => $value) {
$postArray[":" . $value] = $value;
}
输出如下:
$postArray = array(":victor" => "victor", ":victor@xample.com" => "victor@xample.com")
问题在于和电子邮件之后的sql语法因为点:
$sql ="SELECT userFirstName FROM users WHERE userLogin = :victor AND userEmail = :victor@xample.com";
我尝试像victor@xample\.com
那样执行此操作,但仍然无效
任何人对此都有任何提示或解决方案吗?
答案 0 :(得分:1)
您不需要准备好的语句占位符与其绑定值具有相同的名称。
只需将您的代码更改为:
foreach ($values as $key => $value) {
$postArray[":" . $key] = $value;
}
只需确保绑定正确的键/值对。
答案 1 :(得分:1)
您不希望将这些值用作参数的名称 - 而是使用固定参数名称和帖子中的值:
foreach ($values as $key => $value) {
$postArray[":" . $key] = $value;
}
生成这样的输出:
$postArray = array(":login" => "victor", ":email" => "victor@xample.com")
然后你的SQL将是:
$sql ="SELECT userFirstName FROM users WHERE userLogin = :login AND userEmail = :email";
您需要确保您的POST元素为login
和email
- 请注意,您不应仅仅依赖于您的表单已定义它们这一事实 - 这很容易被欺骗。将代码设置为:
$sql ="SELECT userFirstName FROM users WHERE userLogin = :login AND userEmail = :email";
$dbs = $dbh->prepare($sql);
$params = array(':login' => isset($_POST['login']) ? $_POST['login'] : '',
':email' => isset($_POST['email']) ? $_POST['email'] : '');
$dbs->execute($params);
答案 2 :(得分:1)
我想你可能想要:
$postArray[":" . $key] = $value; // Note: don't do this either (see below)
将“name”绑定到“value”。您不要将该值用作命名参数,而是它是什么。因此,对于用户名,请不要使用命名参数“Viktorino”,而是将其设为“用户名”。
然而,尽管如此,即使您使用预准备语句,执行此操作也会让您完全接受SQL注入,因为您直接在查询中插入$_POST
值(或名称)。这是件坏事,因为任何人都可以轻松修改您的查询。相反,您需要验证您收到的数据硬编码您期望接收到查询中的值。在这种情况下,没有其他方法可以使你的脚本容易受到攻击。
// *VERY* basic validation. Adjust accordingly
if (empty($_POST['login'])) {
die("You need to enter your login");
}
if (empty($_POST['email'])) {
die("You need to enter your email");
}
$stmt = $dbh->prepare("SELECT userFirstName FROM users WHERE userLogin = :login AND userEmail = :email");
$stmt->bindValue("login", $_POST['login']);
$stmt->bindValue("email", $_POST['email']);
$stmt->execute();