【发布时间】:2019-07-17 16:11:42
【问题描述】:
我有 2 个查询循环遍历它们的记录集以从内部循环提供输出。外部查询循环有几条记录,内部查询应该为每条记录触发。一旦内部循环运行,我只会得到外部查询循环的第一个 recoed。
我尝试将内部查询的 $result 命名为 $result2 并得到错误:sqlsrv_fetch_array(): 提供的资源不是有效的 ss_sqlsrv_stmt 资源。
// outer loop
$serverName = "livedata";
$connectionInfo = array( "Database"=>"ParishHomilyArchive", "UID"=>"ParishUser", "PWD"=>"P@\$\$word" );
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}
if (isset($_REQUEST['Par_Num'])){
$PN = $_REQUEST['Par_Num'];
}
else{
$PN = 0;
}
$sql="SELECT Staff.StaffID, Staff.Name, Staff.Photo, Staff_Position.StaffPage_ID, StaffPages.StaffPageName FROM parishStaff.dbo.StaffPages RIGHT JOIN (ParishStaff.dbo.Staff_Position RIGHT JOIN ParishStaff.dbo.Staff ON Staff_Position.Staff_ID = Staff.StaffID) ON StaffPages.StaffPageID = Staff_Position.StaffPage_ID WHERE (((Staff.par_Num)=" . $PN . ")) ORDER BY Staff.Name, StaffPages.StaffPageName;";
$stmt = sqlsrv_query( $conn, $sql);
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true));
}
$result = sqlsrv_query($conn, $sql);
while($row = sqlsrv_fetch_array($result)) {
//output outer loop stuff
//inner loop
$serverName = "livedata";
$connectionInfo = array( "Database"=>"database", "UID"=>"User", "PWD"=>"password" );
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}
if (isset($_REQUEST['Par_Num'])){
$PN = $_REQUEST['Par_Num'];
}
else{
$PN = 0;
}
$sql2="SELECT StaffPages.StaffPageID, StaffPages.StaffPageName FROM parishStaff.dbo.ParishPages INNER JOIN ParishStaff.dbo.StaffPages ON ParishPages.StaffPage_ID = StaffPages.StaffPageID WHERE (((ParishPages.Par_Num)=" . $PN . ") AND (Not (StaffPages.StaffPageID)=(SELECT StaffPages.StaffPageID FROM ParishStaff.dbo.StaffPages LEFT JOIN (ParishStaff.dbo.Staff_Position LEFT JOIN ParishStaff.dbo.Staff ON Staff_Position.Staff_ID = Staff.StaffID) ON StaffPages.StaffPageID = Staff_Position.StaffPage_ID WHERE (((Staff.StaffID)=" . $row['StaffID']. " )))));";
$stmt = sqlsrv_query( $conn, $sql2);
if( $stmt2 === false ) {
die( print_r( sqlsrv_errors(), true));
}
$result = sqlsrv_query($conn, $sql2);
while($row2 = sqlsrv_fetch_array($result)) {
//output inner loop stuff
}
}
我希望外循环在内循环的第一次迭代后不结束。
【问题讨论】:
-
您迫切需要阅读、理解并开始使用参数化查询。您的代码对 sql 注入是开放的。看看我的朋友bobby tables。他解释了这是多么危险以及如何解决它。
-
我同意@SeanLange,但除此之外,您在内部和外部循环中都使用相同的变量($result),这是有问题的。
标签: php sql sql-server