mysqli와 준비된 문을 사용하여 데이터베이스에 간단한 검색 엔진을 쓰고 있는데, 현재 call_user_func_array를 사용하여 동적으로 쿼리를 작성하고 있습니다. 내 질문입니다 : mysqli를 사용하여 더 빠르고 더 좋은 방법이 있습니까? 당신은 당신의 질문을 해결하기 위해 많은 것들을 가지고은 call_user_func_array가 너무 느립니다.
<?php
session_start();
require('../../../scripts/bkfunctions.php');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');
//////////////////
$resultParameters = array();
$paramsArr =array();
$results = array();
////DB OPEN//////////////////////////////////////////
$conn = dbConnect("ITbunker");
$paramsArr = explode(",", $_GET['paramsQuery']);
$qStr="";
$bindParams = array('s');
////////////////////////////////////
foreach ($paramsArr as $n=>$k) {
if ($n==0) {
$qStr = "SELECT * FROM trabajosEnSubasta WHERE MATCH(titulo, descripcion, habilidades) AGAINST (?)";
}
else {
$qStr .= " UNION SELECT * FROM trabajosEnSubasta WHERE MATCH(titulo, descripcion, habilidades) AGAINST (?)";
$bindParams[0] .= 's';
}
array_push($bindParams, $k);
}
///////////////////////////////////////
///Preparar query y ejecutar
$stmt = $conn->prepare($qStr);
call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($bindParams));
$stmt->execute();
/////////////////////////////////////////////////////////////////////////////////////////*
$meta = $stmt->result_metadata();
while ($campo = $meta->fetch_field()) {
$resultParameters[] = &$row[$campo->name];
}
call_user_func_array(array($stmt, 'bind_result'), $resultParameters);
$i=0;
while ($stmt->fetch()) {
$i++;
foreach($row as $key => $val) {
$results["resultado$i"][$key] = $val;
}
}
echo json_encode($results);
///////////////////////////////////////////////////
$conn->close();
?>
준비된 문을 사용하는 경우 왜 동적으로 쿼리를 만들어야합니까? –
내가 얼마나 많은 단어를 사용자가 제출할 것인지 알지 못하기 때문에 다른 단어를 쉼표로 구분하기 위해 $ _GET 변수를 폭발시킵니다. 단어가 php와 asp ... –
인 단어를 검색하려고한다고 가정합니다 call_user_func_array는 메서드를 명시 적으로 호출하는 것보다 느리지 만 코드를 두 번만 호출 할 때 코드에 눈에 띄는 차이를 만들 가능성은 거의 없습니다. 다양한 UNION 셀렉트를 갖는 것은 페이지 로딩 시간에 1ms를 추가 할 수있는 함수를 사용하는 것보다 훨씬 비싸거나 문제가 될 수 있습니다. – AD7six