Предложение WHERE с пустой строкой не возвращает никаких строк - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть приложение для iOS, в котором я создал API для извлечения некоторых данных из базы данных SQL Server.Когда мое приложение отправляет запрос с пустой строкой, оно не возвращает никаких строк, хотя и должно.

$connectionInfo = array( "Database"=>db, "UID"=>$user, "PWD"=>$pass);
    $conn = sqlsrv_connect($ip, $connectionInfo);
    if ( $conn ) {
        //connected
    }
    else {
        echo "Error:"; echo "<br>";
        die( print_r( sqlsrv_errors(), true));
    }
    /**************************************/
    /*              RETRIEVAL             */
    /**************************************/
    $prod = new StdClass(); $arr = array(); $temp = array();

    $search = $_GET['search'];
    $search = "%$search%";
    $sql = "SELECT
                name, qty
            FROM
                table
            WHERE
                name LIKE ?";
    $stmt = sqlsrv_prepare( $conn, $sql, array($search));
    sqlsrv_execute( $stmt );
    $i = 0;
    if ( $stmt === false ) {
        die( print_r( sqlsrv_errors(), true) );
    }
    else {
        while ( $row=sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) ) {
            $newProd = clone $prod;
            $newProd->mainInfo =  $row['name'];
            $newProd->secondInfo = $row['qty'];
            $arr[] = $newProd;
        }
    }
    http_response_code(200);
    echo json_encode($arr);
    sqlsrv_close($conn);

Я построил API с PHP и Apache на macOS, где он работал как задумано.Когда я скопировал файлы на сервер Windows, если мое приложение получило доступ к ссылке, подобной 192.168.0.102/file.php?search=, оно не вернуло бы строк в Windows, а в macOS вернуло бы все строки таблицы, как я и хотел.Я знаю, что скрипт работает, и нет никаких проблем, потому что, если мое приложение получает доступ к ссылке, подобной 192.168.0.102/file.php?search=someName, оно возвращает соответствующие строки.Я хочу, чтобы приложение отображало все строки, если переменная search пуста.Должен ли я использовать какой-то другой способ для достижения этого, или это какая-то ошибка с моей стороны.

1 Ответ

0 голосов
/ 08 апреля 2019

Вы можете достичь этого, не используя условие sql, когда параметр "search" $ _GET не указан или пуст.

Пример того, как этого добиться, измените код с:

$search = $_GET['search'];
$search = "%$search%";
$sql = "SELECT
                name, qty
            FROM
                table
            WHERE
                name LIKE ?";

примерно так:

$search = null;

if (true === array_key_exists('search', $_GET) && false === empty($_GET['search'])) {
    $search = '%' . $_GET['search'] . '%';
}

$sql = "SELECT name, qty FROM table";

if (false === is_null($search)) {
    $sql .= ' WHERE name LIKE ?';
}
...