【问题标题】:PHP PDO MS SQL Server SELECT LIMITPHP PDO MS SQL Server 选择限制
【发布时间】:2020-05-06 16:06:35
【问题描述】:

我正在使用 PHP PDO 将我的项目从基于 MySQL 的 MS SQL 转换为 MS SQL,下面的代码允许线程思想记录(左和右)如果记录可以说 #1 那么它应该保持在 #1 与最后一个相同记录。我得到错误:

注意:试图访问 bool 类型值的数组偏移量 C:\inetpub\wwwroot\dxbase\DB_Project\private\supplierschoice.php 上 第 96 行

第 96 行是:

<?php echo "<input type='text' id='CSupplierCode' value='" . $row['SupplierCode'] . "'>"; ?>

在那之前我也有$row = $result-&gt;fetch();

在“左”按钮上运行的代码:

<?php
$sql = "SELECT s.SupplierID, ..., l.StreetAddress, ... FROM Suppliers s LEFT JOIN Locations l ON s.SupplierID = l.RefID WHERE l.LocGroup = 1 AND s.SupplierID < '" . $tID . "' ORDER BY s.SupplierID DESC LIMIT 1";
$result = $conn->prepare($sql);
$result->execute();
if (!$result) {
   $sql = "SELECT s.SupplierID, ..., l.StreetAddress, ... FROM Suppliers s LEFT JOIN Locations l ON s.SupplierID = l.RefID WHERE l.LocGroup = 1 AND s.SupplierID = '" . $tID . "'";
   $result = $conn->query($sql);
   if (!$result) { echo "Error creating a record: " . $sql . "<br>" . $conn -> errorInfo();}
}
?>

代码没有到达第二部分 (!$result),因此它会给出警告和空输入。

更新: 尝试使用 SELECT TOP 1

$sql = "SELECT TOP 1 s.SupplierID, s.SupplierCompany, s.SupplierCode, s.Currency, s.PaymentTerm, s.ShippingTerm, s.TMode, s.Agent, s.Carrier, s.Warehouse, l.StreetAddress, l.Suite, l.City, l.Locality, l.State, l.PostalCode, l.Country FROM Suppliers s LEFT JOIN Locations l ON s.SupplierID = l.RefID WHERE l.LocGroup = 1 AND s.SupplierID < '" . $tID . "' ORDER BY s.SupplierID DESC";
    $result = $conn->query($sql);
    if (!$result) {
        $sql = "SELECT s.SupplierID, s.SupplierCompany, s.SupplierCode, s.Currency, s.PaymentTerm, s.ShippingTerm, s.TMode, s.Agent, s.Carrier, s.Warehouse, l.StreetAddress, l.Suite, l.City, l.Locality, l.State, l.PostalCode, l.Country FROM Suppliers s LEFT JOIN Locations l ON s.SupplierID = l.RefID WHERE l.LocGroup = 1 AND s.SupplierID = '" . $tID . "'";
        $result = $conn->query($sql);
        if (!$result) { echo "Error creating a record: " . $sql . "<br>" . $conn -> errorInfo();}
    }

在 ID 小于 #1 之后它仍然没有到达第二部分,而且似乎 (!$result) 在这里不起作用..

【问题讨论】:

  • SQL Server 没有LIMIT 关键字,所以你的说法是错误的。
  • 顺便说一句,您仍然对 SQL 注入持开放态度。没有占位符的准备/执行并不能使它成为真正的准备好的语句。
  • 感谢 Funk 四十九的建议,稍后会跟进,只需要确保我所拥有的工作正常
  • @MaxCB 使用SELECT TOP (1) ... 而不是LIMIT 1
  • 这里的 $result 似乎总是 TRUE,即使小于 #1 的 ID 不存在

标签: php sql-server pdo


【解决方案1】:

好的!经过 100 次试验和错误后,我得到以下代码正常工作 用于在 MS SQL Server 中左右移动

} elseif ($tID > 0 && $Order == 3) {
    $sql = "SELECT TOP 1 s.SupplierID, s.SupplierCompany, s.SupplierCode, s.Currency, s.PaymentTerm, s.ShippingTerm, s.TMode, s.Agent, s.Carrier, s.Warehouse, l.StreetAddress, l.Suite, l.City, l.Locality, l.State, l.PostalCode, l.Country FROM Suppliers s LEFT JOIN Locations l ON s.SupplierID = l.RefID WHERE l.LocGroup = 1 AND s.SupplierID < '" . $tID . "' ORDER BY s.SupplierID DESC";
    $result = $conn->query($sql);
    $row = $result->fetch(PDO::FETCH_ASSOC);
    if (!$row) {
        $sql = "SELECT s.SupplierID, s.SupplierCompany, s.SupplierCode, s.Currency, s.PaymentTerm, s.ShippingTerm, s.TMode, s.Agent, s.Carrier, s.Warehouse, l.StreetAddress, l.Suite, l.City, l.Locality, l.State, l.PostalCode, l.Country FROM Suppliers s LEFT JOIN Locations l ON s.SupplierID = l.RefID WHERE l.LocGroup = 1 AND s.SupplierID = '" . $tID . "'";
        $result = $conn->query($sql);
        $row = $result->fetch(PDO::FETCH_ASSOC);
    }
} elseif ($tID > 0 && $Order == 7) {
    $sql = "SELECT TOP 1 s.SupplierID, s.SupplierCompany, s.SupplierCode, s.Currency, s.PaymentTerm, s.ShippingTerm, s.TMode, s.Agent, s.Carrier, s.Warehouse, l.StreetAddress, l.Suite, l.City, l.Locality, l.State, l.PostalCode, l.Country FROM Suppliers s LEFT JOIN Locations l ON s.SupplierID = l.RefID WHERE l.LocGroup = 1 AND s.SupplierID > '" . $tID . "' ORDER BY s.SupplierID ASC";
    $result = $conn->query($sql);
    $row = $result->fetch(PDO::FETCH_ASSOC);
    if (!$row) {
        $sql = "SELECT s.SupplierID, s.SupplierCompany, s.SupplierCode, s.Currency, s.PaymentTerm, s.ShippingTerm, s.TMode, s.Agent, s.Carrier, s.Warehouse, l.StreetAddress, l.Suite, l.City, l.Locality, l.State, l.PostalCode, l.Country FROM Suppliers s LEFT JOIN Locations l ON s.SupplierID = l.RefID WHERE l.LocGroup = 1 AND s.SupplierID = '" . $tID . "'";
        $result = $conn->query($sql);
        $row = $result->fetch(PDO::FETCH_ASSOC);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-14
    • 2016-09-15
    • 1970-01-01
    • 2013-02-03
    • 2013-09-27
    • 2014-02-04
    • 2012-09-17
    • 1970-01-01
    相关资源
    最近更新 更多