使用 PHP 在 MSSQL 中查询来自用户的数据
Query with data from user in MSSQL with PHP
(我实习期间被迫在微软 sql 服务器上工作)。
我不明白为什么我的查询在 PHP 中不起作用(它 returns 没有数据),但是当我将它直接放在 Microsoft SQL Server Management Studio 中时它起作用了(它 returns数据)。
这是我的代码:
<?php
require('conn.php');
if(isset($_POST['submit-search'])){
$search = $_POST['search'];
$sql = "SELECT codepo, codepsa, controle, FORMAT(date, 'dd-MM-yyyy hh:mm:ss') as date FROM dbo.codebarre where datediff(day, date, '$search') = 0";
var_dump($sql);
$result = sqlsrv_query($conn2, $sql);
$queryResult = sqlsrv_num_rows($result);
?>
(...)
<?php
if($queryResult > 0){
while($donnees = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
?>
<tbody>
<tr>
<th style="font-weight: normal;"><?php echo htmlspecialchars($donnees['codepo']); ?></th>
<td><?php echo htmlspecialchars($donnees['codepsa']); ?></td>
<td <?php if ($donnees['controle'] === 'NOK') {
echo 'style="color: red; font-weight: bold"';
} ?>><?php echo htmlspecialchars($donnees['controle']); ?></td>
<td><?php echo $donnees['date'] ?></td>
</tr>
</tbody>
<?php
}
} else {
echo "No data";
}
}
var_dump($sql)
returns我这个:
string(138) "SELECT codepo, codepsa, controle, FORMAT(date,
'dd-MM-yyyy hh:mm:ss') as date FROM dbo.codebarre where datediff(day,
date, '20210107') = 0"
正如我在 Management studio 中粘贴它时告诉你的那样,它有效,所以我不明白为什么它不在这里。
您有两个选择:
- 如果您想获得返回行的确切数量,请使用适当的游标类型执行
sqlsrv_query()
。
- 如果要检查是否有返回的行,请使用
sqlsrv_has_rows()
。
PHP 代码使用 sqlsrv_num_rows()
:
<?php
...
$result = sqlsrv_query($conn2, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
$queryResult = sqlsrv_num_rows($result);
if ($queryResult > 0) {
// Fetch data
}
...
?>
PHP 代码使用 sqlsrv_has_rows()
:
<?php
...
$result = sqlsrv_query($conn2, $sql);
$queryResult = sqlsrv_has_rows($result);
if ($queryResult) {
// Fetch data
}
...
?>
作为附加说明,始终使用参数化语句来防止可能的 SQL 注入问题。正如documentation中提到的,函数sqlsrv_query()
同时进行语句准备和语句执行,可用于执行参数化查询。
<?php
...
$sql = "
SELECT codepo, codepsa, controle, FORMAT(date, 'dd-MM-yyyy hh:mm:ss') AS date
FROM dbo.codebarre
WHERE datediff(day, date, ?) = 0
";
$params = array($search);
$options = array("Scrollable" => SQLSRV_CURSOR_KEYSET);
$result = sqlsrv_query($conn2, $sql, $params, $options);
...
?>
(我实习期间被迫在微软 sql 服务器上工作)。 我不明白为什么我的查询在 PHP 中不起作用(它 returns 没有数据),但是当我将它直接放在 Microsoft SQL Server Management Studio 中时它起作用了(它 returns数据)。
这是我的代码:
<?php
require('conn.php');
if(isset($_POST['submit-search'])){
$search = $_POST['search'];
$sql = "SELECT codepo, codepsa, controle, FORMAT(date, 'dd-MM-yyyy hh:mm:ss') as date FROM dbo.codebarre where datediff(day, date, '$search') = 0";
var_dump($sql);
$result = sqlsrv_query($conn2, $sql);
$queryResult = sqlsrv_num_rows($result);
?>
(...)
<?php
if($queryResult > 0){
while($donnees = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
?>
<tbody>
<tr>
<th style="font-weight: normal;"><?php echo htmlspecialchars($donnees['codepo']); ?></th>
<td><?php echo htmlspecialchars($donnees['codepsa']); ?></td>
<td <?php if ($donnees['controle'] === 'NOK') {
echo 'style="color: red; font-weight: bold"';
} ?>><?php echo htmlspecialchars($donnees['controle']); ?></td>
<td><?php echo $donnees['date'] ?></td>
</tr>
</tbody>
<?php
}
} else {
echo "No data";
}
}
var_dump($sql)
returns我这个:
string(138) "SELECT codepo, codepsa, controle, FORMAT(date, 'dd-MM-yyyy hh:mm:ss') as date FROM dbo.codebarre where datediff(day, date, '20210107') = 0"
正如我在 Management studio 中粘贴它时告诉你的那样,它有效,所以我不明白为什么它不在这里。
您有两个选择:
- 如果您想获得返回行的确切数量,请使用适当的游标类型执行
sqlsrv_query()
。 - 如果要检查是否有返回的行,请使用
sqlsrv_has_rows()
。
PHP 代码使用 sqlsrv_num_rows()
:
<?php
...
$result = sqlsrv_query($conn2, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
$queryResult = sqlsrv_num_rows($result);
if ($queryResult > 0) {
// Fetch data
}
...
?>
PHP 代码使用 sqlsrv_has_rows()
:
<?php
...
$result = sqlsrv_query($conn2, $sql);
$queryResult = sqlsrv_has_rows($result);
if ($queryResult) {
// Fetch data
}
...
?>
作为附加说明,始终使用参数化语句来防止可能的 SQL 注入问题。正如documentation中提到的,函数sqlsrv_query()
同时进行语句准备和语句执行,可用于执行参数化查询。
<?php
...
$sql = "
SELECT codepo, codepsa, controle, FORMAT(date, 'dd-MM-yyyy hh:mm:ss') AS date
FROM dbo.codebarre
WHERE datediff(day, date, ?) = 0
";
$params = array($search);
$options = array("Scrollable" => SQLSRV_CURSOR_KEYSET);
$result = sqlsrv_query($conn2, $sql, $params, $options);
...
?>