PHP PDO AJAX查询不工作,我的眼睛交叉


PHP PDO AJAX Query not working, my eyes are crossing

我正在重新编写一个文件,该文件将动态构建查询,以搜索和匹配ajax事件传递的字符串中的任何单词。。。

我无法得到返回数据的东西。它看起来一切都很完美,但事实并非如此。我在萤火虫身上得到的只是成功:真的。。这很好,因为这意味着没有错误,但我的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替换为"mar",您可以从终端和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

尝试使用:

header('Content-Type: text/javascript');

使用类似Firebug/Network视图的东西检查http结果-它可能返回正确,只是没有在Javascript中解析。

您的问题可能在以下行:

foreach($search_results as $col=>$val) {
    $result[$i][$col] = $val;
    $i++;
    //echo "$col >> $val";
}

在这一点上,代码$i从$num_search_elements的值开始,然后向上计数。在代码中使用$i计数到$num_search_elements的上一个循环之后,它永远不会被重新初始化并设置为0。

当您在上面的循环之后打印_r($result)时会发生什么?在这个循环之前打印_r($search_results)时会发生什么?它们匹配吗?

上述代码可以替换为:

foreach($search_results as $col=>$val) {
    $result[][$col] = $val;
}

它将从0开始向上索引。

您的问题来自于您生成的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)) ) {

看看它是否有效。

它不起作用的原因是我在"中有绑定的搜索迭代(:search0…),这将它变成一个与数据库中的任何内容都不匹配的文本。