我正在重写一个文件,该文件将动态构建查询以搜索并匹配ajax事件传递的字符串中的任何单词...
我无法得到返回数据的东西。它的作用就像一切都很完美,但事实并非如此。我在firebug中获得的只是成功:true..which很好,因为这意味着没有错误,但我的SQL结果没有被传递。
我知道这些代码将会为你们所有人提供,但它不起作用......
我大部分时间都在重新使用这段代码,所以它不漂亮或完美,我只是希望它再次返回搜索结果...
比尔,如果你正在读这篇文章,我没有机会研究你上周建议的%LIKE替代方案......还在邮件中等待你的书。
很抱歉将大量代码转发给你们,但我不知道这里有什么问题。
function CreateOptions($columns, $num_elements, $condition="AND") {
$colcount = count($columns);
$optionString = " ";
for ($ii=0; $ii < $num_elements; $ii++) {
if ($ii > 0)
$optionString .= " AND (";
for ($i=0; $i<$colcount; $i++) {
if ($i>0)
$optionString .= " OR ";
$optionString .= $columns[$i] . " LIKE '%:search$ii%'";
}
//$optionString .= ")";
}
return $optionString;
}
include_once('../sys/core/init.inc.php');
$json = array();
$result = array();
if (isset($_POST['searchTerm'])){
try {
$search = trim($_POST['searchTerm']);
$search = preg_replace('/\s+/', ' ', $search);
$search = explode(" ", $search);
$num_search_elements = count($search);
switch($_POST['category']) {
case ("account"):
$querySyntax = "SELECT
idAccount,
FirstName,
LastName,
Email,
Phone,
CCCity,
db_name.states.Abbreviation
FROM
db_name.account Right Join
db_name.states On
db_name.account.CCState =
db_name.states.ID
WHERE";
$cols = Array ("FirstName", "LastName", "Phone", "Email", "idAccount");
$querySyntax .= CreateOptions($cols, $num_search_elements);
break;
default:
break;
}
$querySyntax .= " LIMIT 50";
// Build and run query (change to execute)
$dbs = $dbo->prepare($querySyntax);
for($i=0; $i<$num_search_elements; $i++) {
if ($dbs->bindValue(":search$i", $search[$i], (is_int($search[$i]) ? PDO::PARAM_INT : PDO::PARAM_STR))) {
// yea i know... nothing here its all below still
} else {
die("BIND_ERROR");
}
}
$dbs->execute();
// Put the array together
$search_results = $dbs->fetchAll(PDO::FETCH_ASSOC);
//print_r($search_results);
foreach($search_results as $col=>$val) {
$result[$i][$col] = $val;
$i++;
//echo "$col >> $val";
}
$stmt = null;
$result["success"] = true;
}
catch (PDOException $e) {
$result["success"] = false;
$result["error"] = $e->getMessage() . " >> SQL: $querySyntax";
}
} else {
$result["success"] = false;
$result["error"] = "INVALID DATA";
}
header('Content-type: application/json');
echo json_encode($result);
当我告诉它回应查询时,以下是直接从Firebug获取的生成的SQL:
SELECT
idAccount,
FirstName,
LastName,
Email,
Phone,
CCCity,
db_name.states.Abbreviation
FROM
db_name.account Right Join
db_name.states On db_name.account.CCState =
db_name.states.ID
WHERE
FirstName LIKE '%:search0%' OR
LastName LIKE '%:search0%' OR
phone LIKE '%:search0%' OR
email LIKE '%:search0%' OR
idAccount LIKE '%:search0%'
LIMIT 50
替换:search0 with“mar”你从我的db in terminal和phpmyadmin得到这个:
1 Mar <my real name> myemail@email 1231231234 City FL
2 Martin Short mshort@movies.com 2147483647 Beverly Hills CA
4 Martin Short mshort@email.com 2146791243 Beverly Hills CA
5 Martin Short mshort@movies.coms 2146791243 Beverly Hills CA
答案 0 :(得分:1)
尝试使用:
header('Content-Type: text/javascript');
使用类似Firebug / Network视图的内容检查您的http结果 - 它可能正确返回,只是没有在Javascript中解析。
答案 1 :(得分:1)
您的问题来自您生成的SQL查询。 我建议你从PDO中获取你的查询,并在phpmyadmin或mysql控制台中尝试。 如果它在那里工作,那么你的PHP脚本没有正确生成SQL。如果是这种情况,如果您向我们展示真正的SQL查询和数据库中的结果,那将会有很多帮助。
编辑: 尝试替换它:
for ( $i = 0; $i < $num_search_elements; $i++ ) {
if ( $dbs->bindValue(":search$i", $search[ $i ], (is_int($search[ $i ]) ? PDO::PARAM_INT : PDO::PARAM_STR)) ) {
有了这个
for ( $i = 0; $i < $num_search_elements; $i++ ) {
$var = ":search".$i;
if ( $dbs->bindValue($var, $search[ $i ], (is_int($search[ $i ]) ? PDO::PARAM_INT : PDO::PARAM_STR)) ) {
看看它是否有效。
答案 2 :(得分:1)
您的问题可能就在这一行:
foreach($search_results as $col=>$val) {
$result[$i][$col] = $val;
$i++;
//echo "$col >> $val";
}
此时,代码$ i以$ num_search_elements的值开头,并从那里向上计数。它永远不会重新初始化,并且在使用$ i计算到$ num_search_elements的代码中的前一个循环之后设置为0.
在上面的循环之后print_r($ result)会发生什么?在此循环之前print_r($ search_results)会发生什么?他们匹配吗?
以上代码可以替换为:
foreach($search_results as $col=>$val) {
$result[][$col] = $val;
}
从0开始向上指数。
答案 3 :(得分:0)
它无法工作的原因是因为我在''中进行了绑定搜索迭代(:搜索0 ...),这使得它变成了一个与数据库中的任何内容都不匹配的文字。