如何显示来自 SQL 服务器的数据
How to display data from SQL Server
我能连接上但是数据不显示。此行出现一些错误:
if($result ->num_rows > 0)
此数据库的 table 名称是“ndtatt”。
这个 table 有 4 列。这只是存储在该数据库中的值的一个示例。
- varchar 卡号 = 值 009145
- varchar STAFF = 值 V0822
- varchar NAME = 值 Marry
- Varchar ATTDATE = 值 2020/01/04
.
<?php
$serverName = "LAPTOP-61BF65AR";
$connectionInfo = array("Database"=>"LocalDatabase");
$conn = sqlsrv_connect ($serverName, $connectionInfo);
if ($conn) {
echo " Connection established.<br/>";
}else{
echo "Connection Failed.<br />";
die(print_r (sqlsrv_errors() , true));
}
$attDate = $_GET['attDate'];
$cardNo = $_GET['cardNo'];
$sql = "SELECT * FROM ndtatt WHERE ATTDATE = '$attDate' AND CARDNO = '$cardNo'";
$result = sqlsrv_query ($conn, $sql);
if($result ->num_rows> 0)
{while($row = $result->fetch_assoc())
{?>
<tr>
<td><?php echo $row['CARDNO']; ?></td>
<td><?php echo $row['STAFF']; ?></td>
<td><?php echo $row['NAME']; ?></td>
<td><?php echo $row['ATTDATE']; ?></td>
</tr>
<?php
}}
else {echo "0 results";}
$conn->close();
?>
下面是 html 文件:
<form method="GET" action="get3.php">
<h3 class="absolute" > Attendance Date :
<input type="date" name="attDate"> </h3>
</br></br></br>
<h3 class="absolute2" > Card Number :
<input type="text" name="cardNo" placeholder="Card Number"> </h3>
</br></br></br></br></br>
<center> <input type="submit" name="search" value="Search" class="button" /> </center>
</form>
第一个源码本来是给php(xampp)数据库用html的,但是我做了一些改动,因为我想改数据库(php) 进入 sql 服务器。
我需要更改整个源代码还是像我在给定的源代码中所做的那样做一些更改?
XAMPP和SQL服务器有关系吗?我的意思是,要使用 SQL 服务器,我是否需要在 运行 代码时打开 XAMPP?
下面的查询将通过连接检索两个 table 数据:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
XAMPP 是一个包含 MariaDB、PHP 和 Perl 的 Apache 发行版,因此您唯一需要连接到 SQL 服务器的就是安装 PHP SQL 服务器的驱动程序(您在代码中使用 sqlsrv_
函数)。
但是您的代码有一些问题:
- 您只需使用
sqlsrv_
个函数。对 $result->num_rows
、$result->fetch_assoc()
和 $conn->close()
的调用将引发错误。
- 您需要使用
"ReturnDatesAsStrings" => true
作为连接选项来获取 date/time 值作为字符串(默认值为 false
并且 date/time 列的值为作为 PHP DateTime 对象返回。
- table 中的日期值存储为文本,因此您需要转换
"date"
类型的输入元素的值以匹配 table 中的格式( yyyy-mm-dd
)。作为旁注,如果可能,不要将日期值存储为文本。使用适当的数据类型 - 在本例中为 date
或 datetime2
。
- 始终尝试在语句中使用参数以防止 SQL 注入问题。 documentation中提到,
sqlsrv_query()
函数既做语句准备又做语句执行,可用于执行参数化查询.
示例,基于问题中的代码:
<?php
// Connection
$serverName = "LAPTOP-61BF65AR";
$connectionInfo = array(
"ReturnDatesAsStrings" => true,
"Database" => "LocalDatabase"
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn) {
echo " Connection established.<br/>";
} else {
echo "Connection Failed.<br />";
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
exit;
}
// Query
$attDate = DateTime::createFromFormat('Y-m-d', $_GET['attDate'])->format('Y/m/d');
$cardNo = $_GET['cardNo'];
$sql = "SELECT * FROM ndtatt WHERE ATTDATE = ? AND CARDNO = ?";
$params = array($attDate, $cardNo);
$result = sqlsrv_query ($conn, $sql, $params);
if ($result === false ) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
// Fetch data
if (sqlsrv_has_rows($result)) {
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
?>
<tr>
<td><?php echo $row['CARDNO']; ?></td>
<td><?php echo $row['STAFF']; ?></td>
<td><?php echo $row['NAME']; ?></td>
<td><?php echo $row['ATTDATE']; ?></td>
</tr>
<?php
}
} else {
echo "0 results";
}
// End
sqlsrv_free_stmt($result);
sqlsrv_close($conn);
?>
备注:
问题中的代码是特定于驱动程序的,但您可以尝试使用 PDO (PHP Data Objects) 重写此代码。有了PDO,使用新的代码,你可以使用任何支持的数据库(当然你需要安装一个database-dependant实现了PDO接口的驱动)。
我能连接上但是数据不显示。此行出现一些错误:
if($result ->num_rows > 0)
此数据库的 table 名称是“ndtatt”。 这个 table 有 4 列。这只是存储在该数据库中的值的一个示例。
- varchar 卡号 = 值 009145
- varchar STAFF = 值 V0822
- varchar NAME = 值 Marry
- Varchar ATTDATE = 值 2020/01/04
.
<?php
$serverName = "LAPTOP-61BF65AR";
$connectionInfo = array("Database"=>"LocalDatabase");
$conn = sqlsrv_connect ($serverName, $connectionInfo);
if ($conn) {
echo " Connection established.<br/>";
}else{
echo "Connection Failed.<br />";
die(print_r (sqlsrv_errors() , true));
}
$attDate = $_GET['attDate'];
$cardNo = $_GET['cardNo'];
$sql = "SELECT * FROM ndtatt WHERE ATTDATE = '$attDate' AND CARDNO = '$cardNo'";
$result = sqlsrv_query ($conn, $sql);
if($result ->num_rows> 0)
{while($row = $result->fetch_assoc())
{?>
<tr>
<td><?php echo $row['CARDNO']; ?></td>
<td><?php echo $row['STAFF']; ?></td>
<td><?php echo $row['NAME']; ?></td>
<td><?php echo $row['ATTDATE']; ?></td>
</tr>
<?php
}}
else {echo "0 results";}
$conn->close();
?>
下面是 html 文件:
<form method="GET" action="get3.php">
<h3 class="absolute" > Attendance Date :
<input type="date" name="attDate"> </h3>
</br></br></br>
<h3 class="absolute2" > Card Number :
<input type="text" name="cardNo" placeholder="Card Number"> </h3>
</br></br></br></br></br>
<center> <input type="submit" name="search" value="Search" class="button" /> </center>
</form>
第一个源码本来是给php(xampp)数据库用html的,但是我做了一些改动,因为我想改数据库(php) 进入 sql 服务器。
我需要更改整个源代码还是像我在给定的源代码中所做的那样做一些更改?
XAMPP和SQL服务器有关系吗?我的意思是,要使用 SQL 服务器,我是否需要在 运行 代码时打开 XAMPP?
下面的查询将通过连接检索两个 table 数据:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
XAMPP 是一个包含 MariaDB、PHP 和 Perl 的 Apache 发行版,因此您唯一需要连接到 SQL 服务器的就是安装 PHP SQL 服务器的驱动程序(您在代码中使用 sqlsrv_
函数)。
但是您的代码有一些问题:
- 您只需使用
sqlsrv_
个函数。对$result->num_rows
、$result->fetch_assoc()
和$conn->close()
的调用将引发错误。 - 您需要使用
"ReturnDatesAsStrings" => true
作为连接选项来获取 date/time 值作为字符串(默认值为false
并且 date/time 列的值为作为 PHP DateTime 对象返回。 - table 中的日期值存储为文本,因此您需要转换
"date"
类型的输入元素的值以匹配 table 中的格式(yyyy-mm-dd
)。作为旁注,如果可能,不要将日期值存储为文本。使用适当的数据类型 - 在本例中为date
或datetime2
。 - 始终尝试在语句中使用参数以防止 SQL 注入问题。 documentation中提到,
sqlsrv_query()
函数既做语句准备又做语句执行,可用于执行参数化查询.
示例,基于问题中的代码:
<?php
// Connection
$serverName = "LAPTOP-61BF65AR";
$connectionInfo = array(
"ReturnDatesAsStrings" => true,
"Database" => "LocalDatabase"
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn) {
echo " Connection established.<br/>";
} else {
echo "Connection Failed.<br />";
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
exit;
}
// Query
$attDate = DateTime::createFromFormat('Y-m-d', $_GET['attDate'])->format('Y/m/d');
$cardNo = $_GET['cardNo'];
$sql = "SELECT * FROM ndtatt WHERE ATTDATE = ? AND CARDNO = ?";
$params = array($attDate, $cardNo);
$result = sqlsrv_query ($conn, $sql, $params);
if ($result === false ) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
// Fetch data
if (sqlsrv_has_rows($result)) {
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
?>
<tr>
<td><?php echo $row['CARDNO']; ?></td>
<td><?php echo $row['STAFF']; ?></td>
<td><?php echo $row['NAME']; ?></td>
<td><?php echo $row['ATTDATE']; ?></td>
</tr>
<?php
}
} else {
echo "0 results";
}
// End
sqlsrv_free_stmt($result);
sqlsrv_close($conn);
?>
备注:
问题中的代码是特定于驱动程序的,但您可以尝试使用 PDO (PHP Data Objects) 重写此代码。有了PDO,使用新的代码,你可以使用任何支持的数据库(当然你需要安装一个database-dependant实现了PDO接口的驱动)。