【问题标题】:php sqlsrv_fetch_array return to jsonphp sqlsrv_fetch_array 返回 json
【发布时间】:2021-06-09 01:32:40
【问题描述】:

任何机构都可以提供帮助。如何从 TSQL 数据库提取的数据中删除 \r\n?我使用 PHP 来检索数据。

http://localhost/model1.php?model=ROLL

$model = (isset($_GET['model'])) ? $_GET['model'] : '';

$model = str_replace('\r\n','', $model);

if ($model != '') {
$tsql = "SELECT Brand,Model from product where Model LIKE '%$model%'";

$stmt = sqlsrv_query( $conn, $tsql );
$result = array();
$row_check = sqlsrv_has_rows( $stmt );

if ($row_check == true) {
    while ($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)) {
        $result['Response'][] = array(
            'Brand' => $row['Brand'],
            'Model' => $row['Model']
        );
    }
}
..
..
..
header('Content-Type: application/json');

echo json_encode($result, true);
die();

【问题讨论】:

  • str_replace("\r\n","", $str)
  • str_replace("\r\n"," ", $str)
  • 我已经实现了这个..但是什么也没发生.. $model = str_replace('\r\n','', $model);
  • 你确定你的 $model 变量有你认为的文本吗?临时放置一个 print_r($model); 可能是个好主意。在该代码的第一行之前的行,以查看该变量包含的内容。 :)
  • $model 来自 URL 参数..

标签: php sql json


【解决方案1】:

就像the comment from earlier 中提到的切向垂直,也可能像the PHP documentation might indicate in its example that contains a "\r\n",当我尝试以下代码示例时:

<?php

// ref: https://stackoverflow.com/q/66576069/1167750
$_GET['model'] = "2 ROLLING HOOPS\r\nAND 2 SETS OF 3\r\nCORRUGATIONS;";

$model = (isset($_GET['model'])) ? $_GET['model'] : '';

// ref: https://stackoverflow.com/questions/66576069
//   /php-sqlsrv-fetch-array-return-to-json#comment117691397_66576069
$model = str_replace("\r\n", " ", $model);

echo "Result:\n";
echo $model;
echo "\n";

?>

我使用 PHP 7.3.27 得到这个输出:

Result:
2 ROLLING HOOPS AND 2 SETS OF 3 CORRUGATIONS;

如果我在执行str_replace('\r\n', ' ', $model); 时只使用单引号,我会得到以下输出:

Result:
2 ROLLING HOOPS
AND 2 SETS OF 3
CORRUGATIONS;

这可能不是您想要得到的结果。因此,我仍然建议为此使用双引号方法。

我建议您尝试一个简单的代码示例(如本文所示),看看您是否得到相同的结果。如果有其他因素影响您的结果,这可能有助于缩小范围。例如,在此过程中,您的$_GET['model']$model 相关内容可能发生了一些奇怪的事情。

另外,我建议在不久的将来使用prepared statements 以确保安全! might be bad 如果有人将奇怪的输入作为 $_GET['model'] 变量发送给你。

更新:

在使用本文前面的测试代码尝试了与此类似的示例 URL 后:http://localhost/q26.php?model=2%20ROLLING%20HOOPS\r\nAND%202%20SETS%20OF%203\r\nCORRUGATIONS;

我发现我需要将下面的str_replace() 行修改为如下所示:

$model = str_replace("\\r\\n", " ", $model);

为了补偿\r\n 的读取方式。

因此,相关的更新示例代码现在如下所示:

<?php

$model = (isset($_GET['model'])) ? $_GET['model'] : '';

// ref: https://stackoverflow.com/questions/66576069
//   /php-sqlsrv-fetch-array-return-to-json#comment117691397_66576069
$model = str_replace("\\r\\n", " ", $model);

echo "Result:\n";
echo $model;
echo "\n";

?>

我不确定为什么\r\n 部分可能存在浏览器差异。为了检查,我使用示例查询尝试了之前相关的更新代码,它似乎在 Chrome(88.0.x 版)和 Firefox(86.0.x 版)中都适用:

Chrome 结果:

火狐结果:

【讨论】:

  • 我检测到问题可能是浏览器..如果我使用 mozilla \r\rn 仍然出现..但如果我使用 chrome \r\n 没有出现...究竟是什么问题?跨度>
  • 你能告诉我如何根据上面的代码实现准备好的语句吗?
  • 嗨@twister,我已经更新了上面的帖子以可能解决您的第一点,尽管它可能无法回答您的问题。
  • @twister:至于你关于实施准备好的陈述的问题,我认为这可能与你原来的帖子有足够的不同,你可能想提出一个关于如何实施准备好的陈述的新问题您声明的LIKE 部分。但在此之前,我建议您在网上搜索一下,看看这个问题是否已经得到解答。快速搜索,我发现this other post 可能会解决这个问题。
  • @twister 不过,与the other thread 中讨论的PDO prepare() 语句相比,sqlsrv_prepare() 的工作方式可能存在一些差异。
猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多