如何在mysqli

时间:2015-08-28 17:49:41

标签: php mysql mysqli prepared-statement

我想根据用户的请求从表中提取数据列表。

1. $query = "SELECT * FROM users LIMIT 10";
2. $query = "SELECT * FROM users WHERE fname = ? LIMIT 10";
3. $query = "SELECT * FROM users WHERE fname = ? AND mname = ? LIMIT 10";
4. $query = "SELECT * FROM users WHERE fname = ? AND mname = ? AND lname = ? LIMIT 10";

如果没有提供参数,请查询(1)
如果提供了名字,则查询(2)
如果提供了第一个和中间名,则查询(3)
如果全部提供,请查询(4)

我很难知道用户会要求哪一个 如何从上面准备,绑定,执行和获取所选数据的数据?

更新:更多细节。

<?php

    $db = new mysqli("It's all OK");
    $query = "SELECT * FROM users LIMIT 10";
    $fname = (isset($_POST['fname']) AND !empty($_POST['fname'])) ? trim($_POST['fname']) : "";
    $mname = (isset($_POST['mname']) AND !empty($_POST['mname'])) ? trim($_POST['mname']) : "";
    $lname = (isset($_POST['lname']) AND !empty($_POST['lname'])) ? trim($_POST['lname']) : "";

    if(!empty($fname) AND empty($mname) AND empty($lname)){
      $query .= " WHERE fname = ? LIMIT 10";
     }elseif(!empty($fname) AND !empty($mname) AND empty($lname)){
      $query .= " WHERE fname = ? AND mname = ? LIMIT 10";
     }elseif(!empty($fname) AND !empty($mname) AND !empty($lname)){
      $query .= " WHERE fname = ? AND mname = ? AND lname = ? LIMIT 10";
     }

?>

鉴于所有细节,构建了查询,但很难预测用户将要求的内容。

我做了:

$stmt = $db->prepare($query);

现在我遇到了绑定不可预测参数的问题 请帮忙。

3 个答案:

答案 0 :(得分:1)

我猜你有变量,比如fname,mname和lname。把它们放在像

这样的数组中
$options = ['fname' => $fname, 'mname' => $mname, 'lname'=> $lname];
$defaults = ['fname' => '', 'mname' => '', 'lname'=> ''];

$options = array_merge($defaults, $options);

$options = array_diff($options, []);

$query = "SELECT * FROM users";
foreach ($options as $key => $value){
     $query .= " AND $key = ?"
}
$query .= ' LIMIT 10';

答案 1 :(得分:0)

有一个很棒的解决方案

git config --global http.sslVerify false

仅当查询的值不为null时,才会在查询中使用该变量。 这样,对于任意数量的参数组合,您只需要一个查询和一组参数。

$fname = (!empty($_POST['fname'])) ? trim($_POST['fname']) : NULL;
$mname = (!empty($_POST['mname'])) ? trim($_POST['mname']) : NULL;
$query = "SELECT * FROM users WHERE 
        (? is null OR fname = ?) 
    AND (? is null OR mname = ?) 
    AND so on
LIMIT 10";

(你需要将每个变量绑定两次) 但是这种方法只会让你只使用一个查询并直接调用带有常数变量的bind_param()。

但是如果你仍想要绑定未知数量的变量,here is the solution

如果仅提供lname或fname和lname但没有mname,那么您自己的解决方案将无法工作。
有时候我认为在SO上分享知识是最浪费时间的。

答案 2 :(得分:-1)

感谢所有人的努力回答。我真的很感激。

经过多次尝试后,我将其设法运行。

    $stmt->prepare($query);
    if(!empty($fname) AND empty($mname) AND empty($lname)){
          $stmt->bind_param("s", $fname);
    }elseif(!empty($fname) AND !empty($mname) AND empty($lname)){
          $stmt->bind_param("ss", $fname, $mname);
    }elseif(!empty($fname) AND !empty($mname) AND !empty($lname)){
          $stmt->bind_param("sss",$fname,$mname,$lname);
    }
   $stmt->execute()

并绑定结果,获取所有内容。 它可能不是最佳答案,但确实有效。

再次感谢所有人。