PHP MySQL绑定语句情况

时间:2017-04-02 21:18:16

标签: php mysql binding

我必须在我的应用程序中创建一个Web服务,以便使用PHP从MySQL数据库中提取数据。我不知道我想做什么会不会起作用,因为我不熟悉PHP。这是代码:

$queryString = "SELECT uniqueID, address FROM main WHERE (state = ?) AND (propType IN (?)";
$stmt = mysqli_prepare($this->connection, $queryString);    
mysqli_stmt_bind_param($stmt, 'ss', $itemst, $itempt);
mysqli_stmt_execute($stmt);

我的问题与我的数据库的propType列的绑定语句有关。在我的应用程序中,有8种不同的属性类型,用户可以单击复选框进行搜索。我想要做的是将字符串拼接成上面用$ itempt表示的一个值,并将这个单独的字符串绑定到SQL语句,但我不知道我是否可以这样做?

如果我不能,那么我必须做以下事情:

$queryString = "SELECT uniqueID, address FROM main WHERE (state = ?) AND (propType IN (?,?,?,?,?,?,?,?)";

这可能会在绑定表达式中变得复杂,因为我必须测试选择了哪些属性类型,并提出各种不同的查询/绑定表达式,这将是费力的。

所以我的问题是," IN"子句,我可以将所有字符串值拼接成一个以逗号分隔的字符串,然后将此单个值绑定到我的查询,或者我是否必须为每个可能的值传递一个单独的变量并单独绑定它们?

感谢您的任何见解!

1 个答案:

答案 0 :(得分:0)

我编辑了我的答案,因为它不起作用并重写了PDO样式的片段并对其进行了测试(仅使用不同的表模式)。

这是:

$servername = "localhost";
$username = "user";
$password = "pass";
$db = "stackoverflow";

try{
    $con = new PDO("mysql:host=$servername;dbname=$db", $username, $password);
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // set this if you want to bind LIMIT values

}catch(PDOException $e){
    $error =  "Connection failed: " . $e->getMessage();
}

$itemst = ['active']; // cast search parameters as array so you can merge them
// watch the order in which you bind them! Else you will never find matching entries
$container = ['some title 1','some title 3','some title 5'];
$limit = [0,2];
$params = array_values(array_merge($itemst,$container,$limit));
$bindStr = implode(",", array_map(function($val) { return "?"; }, $container));
$queryString = "SELECT course_title FROM mysqli_quick WHERE state = ? AND course_title IN ({$bindStr}) LIMIT ?,?";

$stmt = $con->prepare($queryString);

$stmt->execute($params);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($result);

打印

array (size=3)
  0 => 
    array (size=1)
      'course_title' => string 'some title 1' (length=12)
  1 => 
    array (size=1)
      'course_title' => string 'some title 3' (length=12)