2017-04-02 77 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