空字符串的WHERE子句不返回任何行

时间:2019-04-08 15:20:00

标签: php sqlsrv

我有一个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);

我在macOS上使用PHP和Apache构建了API,并且可以按预期工作。当我在Windows服务器上复制文件时,如果我的应用访问了类似于192.168.0.102/file.php?search=的链接,则Windows上将不返回任何行,而在macOS中,它将按我想要的那样返回表的所有行。我知道脚本可以工作,并且没有问题,因为如果我的应用访问类似于192.168.0.102/file.php?search=someName的链接,它将返回相应的行。如果变量search为空,我希望应用程序显示所有行。我应该使用其他方法来实现这一目标,还是我自己犯了一些错误?

1 个答案:

答案 0 :(得分:0)

当不提供“搜索” $ _GET参数或该参数为空时,不使用sql条件即可实现这一目标。

示例说明如何实现,将代码从以下位置更改:

$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 ?';
}