PDO查询字符串

时间:2014-03-04 21:43:48

标签: php mysql sql pdo

抱歉我的英语,我试着正确解释自己。 我正在尝试从数据库中选择数据,其中包含我从POST获得的参数数组 生成自动的数组如下所示:

 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那样执行此操作,但仍然无效

任何人对此都有任何提示或解决方案吗?

3 个答案:

答案 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元素为loginemail - 请注意,您不应仅仅依赖于您的表单已定义它们这一事实 - 这很容易被欺骗。将代码设置为:

会好得多
$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();