问题描述
if($result ->num_rows > 0)
此数据库的表名称为“ ndtatt”。 该表有4列。这只是存储在该数据库中的值的一个示例。
- varchar CARDNO =值009145
- varchar STAFF =值V0822
- varchar名称=值结婚
- 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>
最初的源代码最初是使用html的PHP(xampp)数据库的,但是我做了一些更改,因为我想将数据库(PHP)更改为sql server。
我是否需要更改整个源代码或只是像在给定的源代码中所做的那样进行一些更改?
XAMPP与sql Server有关系吗?我的意思是,要使用sql Server,运行代码时是否需要打开XAMPP?
解决方法
@Hana Hanani-在下面的查询中尝试此操作,这是使用join检索两个表数据
SELECT Orders.OrderID,Customers.CustomerName,Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
,
XAMPP是包含MariaDB,PHP和Perl的Apache发行版,因此连接到SQL Server所需的唯一操作就是安装用于SQL Server的PHP驱动程序(您在代码中使用sqlsrv_
函数) )。
但是您的代码有一些问题:
- 您只需要使用
sqlsrv_
函数。对$result->num_rows
,$result->fetch_assoc()
和$conn->close()
的调用将引发错误。 - 您需要使用
"ReturnDatesAsStrings" => true
作为连接选项以字符串形式获取日期/时间值(默认值为false
,并且日期/时间列的值将作为PHP DateTime对象返回) 。 - 表中的日期值存储为文本,因此您需要转换
"date"
类型的输入元素的值以匹配表(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,可以使用新代码使用任何受支持的数据库(当然,您需要安装实现PDO接口的依赖数据库的驱动程序)。