PHP PDO AJAX Query не работает, мои глаза пересекаются - PullRequest
1 голос
/ 10 января 2012

Я переписываю файл, который будет динамически создавать запросы для поиска и сопоставления любого слова в строке, переданной событием ajax ...

Я не могу заставить вещь вернуть данные. Он действует так, как будто все работает отлично, но это не так. Все, что я получаю в firebug - это успех: правда ... что хорошо, потому что это означает, что ошибки не было, но мои результаты 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);

Вот сгенерированный SQL, взятый прямо из Firebug, когда я говорю ему повторить запрос:

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

Ответы [ 4 ]

1 голос
/ 10 января 2012

Ваша проблема связана с генерируемым вами 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)) ) {

И посмотрите, работает ли он.

1 голос
/ 10 января 2012

Ваша проблема может быть в этой строке:

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

На данный момент в коде $ i начинается со значения $ num_search_elements и отсчитывает вверх оттуда.Он никогда не инициализируется повторно и устанавливается равным 0 после предыдущего цикла в коде, который использует $ i для подсчета до $ num_search_elements.

Что происходит, когда вы печатаете_r ($ result) после вышеуказанного цикла?Что происходит, когда вы печатаете_r ($ search_results) перед этим циклом?Они совпадают?

Приведенный выше код можно заменить на:

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

, который будет индексироваться вверх, начиная с 0.

1 голос
/ 10 января 2012

Попробуйте использовать:

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

Проверьте результаты http, используя что-то вроде Firebug / Network view - он может возвращаться правильно, просто не анализируется в Javascript.

0 голосов
/ 10 января 2012

Причина, по которой он не работал, заключалась в том, что у меня были связанные итерации поиска (: search0 ...) в '', что превращает его в литерал, который не будет ничего совпадать с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...