2017-04-02 72 views
0

我必须在我的应用程序中创建一个Web服务,以使用PHP从MySQL数据库中提取数据。我不知道我想做什么可以工作,或者不是,因为我是PHP新手。这里是代码:PHP MySQL绑定声明情况

$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”子句,我可以将所有的字符串值拼接成一个逗号分隔的字符串,然后将这个单一值绑定到我的查询,或者我必须通过一个为每个可能的值分别设置变量并分别绑定它们?

感谢您的任何见解!

回答

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) 
+0

我是新来的PHP,所以不得不做一个小小的研究你的反应,但这种解决方案看起来辉煌的我。如果我理解正确,我必须将一组搜索参数传递给PHP,这些参数将映射到匹配搜索参数数量的一串问号,然后循环遍历它们并单独绑定每个值。它是否正确?这是否也适用于字符串数组而不是整数? – sax

+0

绝对是。你也可以使用字符串。 – Yolo

+0

Yolo,虽然你的解决方案似乎是一个有效的解决方案,但它看起来并不像mysqli将允许你按照你的建议绑定多个语句的参数。我收到错误“mysqli_stmt_bind_param():变量数量与预准备语句中的参数数量不匹配”。你是否肯定你可以按照你所建议的方式在多个陈述中绑定参数? – sax