我正在使用mysqli和prepared语句为我的数据库编写一个简单的搜索引擎,我目前正在使用call_user_func_array来动态创建我的查询。我的问题是:使用mysqli有更快或更好的方法吗? 这是我的代码:
<?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();
?>
答案 0 :(得分:4)
您的问题需要解决很多问题 - call_user_func_array
不是其中之一。
查看您的查询
这是您正在构建的一种查询:
SELECT
*
FROM
trabajosEnSubasta
WHERE
MATCH(titulo, descripcion, habilidades) AGAINST (?)
UNION
SELECT
*
FROM
trabajosEnSubasta
WHERE
MATCH(titulo, descripcion, habilidades) AGAINST (?)
UNION
SELECT
...
并且......它引出了为什么你这样做的问题。这在功能上是相同的,并且可能更快地执行:
SELECT
*
FROM
trabajosEnSubasta
WHERE
MATCH(titulo, descripcion, habilidades) AGAINST (?)
OR
MATCH(titulo, descripcion, habilidades) AGAINST (?)
OR
...
查看您的逻辑
$paramsArr = explode(",", $_GET['paramsQuery']);
因此,如果您更新查询语法,请求类似/foo?paramsQuery=a,b,c,d,e,f,g,h,i,j
的网址将触发10个表联合查询,这将是一个10全文索引查询。这真的是你想要的吗?它可能是 - 但是例如,如果有人搜索已知的habilidad,那么它的效率会更高:
SELECT
trabajosEnSubasta.*
FROM
trabajosEnSubasta
LEFT JOIN
habilidades_map ON habilidades_map.trabajo_id = trabajosEnSubasta.id
WHERE
habilidades_map.habilidad = "known habilidad"
全文索引的查询成本相对较高,而且不应该是您搜索数据的唯一方法。
描述您的代码
我必须假设你问的是call_user_func_array
,因为你的代码执行起来很慢。不要猜测代码中的问题在哪里查看并找出。
不要浪费你的时间优化0.01%
call_user_func_array
确实需要使用费用,这就是code like this存在的原因。但是差异实在是非常微不足道(特别是考虑到问题中超重的UNION查询),除非你打电话数百次+。专注于对您的应用程序产生最大性能影响的事物,而不是那些在某种程度上完全没有可测量差异的事物。