私のやりたいことは、ドメインのリストを自分のPHPスクリプト($_POST['domains']
)に送り、ドメインが似ているテーブルからすべての従業員を取得します。同じデータを持つ2つの別々のSQL文が異なる結果を返しています
ここでは、forループを使用して複数のクエリを実行する例を示します。これは標準ですが、多くの時間がかかります:
$domains = explode(",", $_POST['domains']);
$returnObj = new stdClass();
$employees = [];
foreach($domains as $domain) {
$domainLike = "%".$domain;
$query = $conn_databank->prepare("SELECT employee_id FROM employee WHERE domain LIKE ?");
$query->bind_param('s', $domainLike);
$query->execute();
$result = $query->get_result();
while($row = $result->fetch_assoc()) {
array_push($employees, $row['employee_id']);
}
}
$returnObj->employees = $employees;
echo json_encode($returnObj);
を今、正しい私の周り3900の結果を得るデータの1セット、と。
私がしようとしている他の方法は、より速く実行LIKE ? OR LIKE ?
を使用して動的プリペアドステートメントを作成することであるが、(950前後)ほぼ同様に多くの結果が返されません。
$queryString = "SELECT employee_id FROM employee";
$actualQuery = "SELECT employee_id FROM employee";
$bindVariables = [];
for($i = 0; $i < count($domains); $i++) {
$domainLike = "%".$domains[$i];
if($i == 0) {
$queryString .= " WHERE (domain LIKE ?";
$actualQuery .= " WHERE (domain LIKE '".$domainLike."'";
}
else {
$queryString .= " OR domain LIKE ?";
$actualQuery .= " OR domain LIKE '".$domainLike."'";
}
if($i == count($domains) - 1) {
$queryString .= ")";
$actualQuery .= ")";
}
array_push($bindVariables, $domainLike);
}
$variables = count(explode("?", $queryString)) - 1;
$bindings = [];
$bindString = "";
for($i = 0; $i < $variables; $i++)
$bindString .= "s";
array_push($bindings, $bindString);
foreach($bindVariables as $variable)
array_push($bindings, $variable);
echo $actualQuery;
$query = $conn_databank->prepare($queryString);
call_user_func_array(array($query, 'bind_param'), makeValuesReferenced($bindings));
$query->execute();
$result = $query->get_result();
$returnObj = new stdClass();
$employees = [];
while($row = $result->fetch_assoc()) {
$employee = new stdClass();
$employee->id = $row['employee_id'];
array_push($employees, $employee);
}
$returnObj->employees = $employees;
echo json_encode($returnObj);
は$actualQuery
変数を無視することそれが適切にクエリを構築しているかどうかを確認することでした。
実際にここで何を求めているのかはっきりしません。 –