忽略 PHP 到 MSSQL 连接中的记录行

Posted

技术标签:

【中文标题】忽略 PHP 到 MSSQL 连接中的记录行【英文标题】:Ignored records rows in PHP to MSSQL connection 【发布时间】:2019-07-18 13:11:58 【问题描述】:

当我用这个查询向 mssql 询问数据时,我遇到了不同结果的问题。直接在服务器上执行它给了我 3 个结果,但从 php 服务器连接它只给了我一行 = 041SE010-0240 propabli 是编码问题,但我不知道如何解决我尝试更改 PHP 服务器连接的编码。我尝试过CP1250,服务器上的CP1251编码是CP1250并整理Czech_CI_AS。

SELECT S.IDS, S.RefStruct, ISNULL(S.StavZ - S.ObjedP, 0) AS quantity
            FROM SKz S
            WHERE S.IDS IN ('092COž01', '00XXž004', '041SE010-0240')  AND RefStruct IN (2, 3)

我的代码:

$where = '';
    if (!empty($this->allowedWarhouses)) 
        $where = ' AND RefStruct IN (' . implode(', ', $this->allowedWarhouses) . ')';
    

$resource = $this->pohodaDatabase->query(
    "SELECT S.IDS, S.RefStruct, ISNULL(S.StavZ - S.ObjedP, 0) AS quantity
    FROM SKz S
    WHERE S.IDS IN ('092COž01', '00XXž004', '041SE010-0240')" . $where
);
$productStocksDataWrapper = array();
var_dump($this->pohodaDatabase->rows($resource));  // int(0)
var_dump($this->pohodaDatabase->getLastQuery()); //SELECT S.IDS,S.RefStruct,ISNULL(S.StavZ - S.ObjedP, 0) AS quantity FROM SKz S WHERE S.IDS IN ('092COž01', '00XXž004', '041SE010-0240') //
while ($row = $this->pohodaDatabase->fetch_assoc($resource)) 
    var_dump($row); // only 041SE010-0240
    $productStocksData = new PohodaProductStocksData();
    $productStocksData
        ->setCatnum($row['IDS'])
        ->setPohodaWarhouseExtId($row['RefStruct'])
        ->setQuantity($row['quantity']);
    $productStocksDataWrapper[] = $productStocksData;

var_dump($productStocksDataWrapper); // just 041SE010-0240
die();

【问题讨论】:

向我们展示 PHP 代码 您使用什么驱动程序连接到 SQL Server 以及您的表定义是什么?谢谢。 您已经指出手动执行查询时会产生预期的结果,那么您如何确认问题出在查询本身而不是 PHP 代码?您实际上是如何观察问题的? 在您的 PHP 中,您正在连接查询的一部分,$where,我们不知道这是什么。 @KubaDolníček 你不是问我们问题的根源在哪里吗?如果您知道问题出在哪里,为什么不在您的问题中这么说呢?您确实需要向我们提供所有信息来诊断您的问题,每次更新都会遗漏一些内容。 $this->allowedWarhouses 的值是多少?如果您的查询没有返回相同的数据,那么它就不是相同的查询。 【参考方案1】:

iconv('UTF-8', 'cp1250', QUERY STRING...);

这是一个毫无意义的解决方案。

【讨论】:

【参考方案2】:
$resource = $this->pohodaDatabase->query(
            "SELECT S.IDS, S.RefStruct, ISNULL(S.StavZ - S.ObjedP, 0) AS quantity
            FROM SKz S
            WHERE S.IDS IN ('092COž01', '00XXž004', '041SE010-0240')" . $where
        );

        $productStocksDataWrapper = array();
        var_dump($this->pohodaDatabase->rows($resource));  // int(0)
        var_dump($this->pohodaDatabase->getLastQuery()); //SELECT S.IDS,S.RefStruct, ISNULL(S.StavZ - S.ObjedP, 0) AS quantity
            FROM SKz S
            WHERE S.IDS IN ('092COž01', '00XXž004', '041SE010-0240') //
        while ($row = $this->pohodaDatabase->fetch_assoc($resource)) 
            var_dump($row); // only 041SE010-0240
            $productStocksData = new PohodaProductStocksData();
            $productStocksData
                ->setCatnum($row['IDS'])
                ->setPohodaWarhouseExtId($row['RefStruct'])
                ->setQuantity($row['quantity']);

            $productStocksDataWrapper[] = $productStocksData;
        

        var_dump($productStocksDataWrapper); // just 041SE010-0240
        die();

【讨论】:

以上是关于忽略 PHP 到 MSSQL 连接中的记录行的主要内容,如果未能解决你的问题,请参考以下文章

正确的 php 中的 mssql 连接字符串

php连接微软MSSQL(sql server)完全攻略

如何用PHP连接SQL Server

php连接MSSQL

php怎么连接sql server 2012

Linux下PHP freetds连接MSSQL 乱码