联接 SQL 查询未能填充下拉列表

Posted

技术标签:

【中文标题】联接 SQL 查询未能填充下拉列表【英文标题】:Joined SQL querie failed to populate dropdown 【发布时间】:2018-11-08 16:18:53 【问题描述】:

我正在尝试创建一个连接的 SQL 查询以填充 html 下拉列表,但它似乎无法正常工作,我不知道为什么。我没有收到任何错误消息或任何东西。下拉列表根本没有填充。肯定有信息应该在下拉列表中,这不是下拉列表缺少数据的问题,而是代码的问题。

<select name="term3sport">
  <option value=" " selected disabled>Please select a third term sport...</option>
  <?php
  include_once('connection.php');
  try
    $stmt = $conn->prepare(
      "SELECT DISTINCT Choices.Choice_ID, Sports.name
      From Sports
      INNER JOIN Choices ON Choices.Sport_ID = Sports.Sport_ID
      INNER JOIN Year ON Year.Year_ID = Choices.Year_ID
      Where Code Like CONCAT('%', :year, '%')
      AND Current='Y' AND (Sex=':sex' OR Sex='B') AND Term_ID='3' AND Year_ID=".$row['Year_ID']." ");
    $stmt->bindParam(':year', $_SESSION['year']);
    $stmt->bindParam(':sex', $_SESSION['sex']);
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
    
      echo("<option value='".$row['Choice_ID']."'>".$row['Name']."</option>");
    
  
  catch(PDOException $e)
  
    echo "error".$e->getMessage();
  
$conn=null;
  ?>
  <input type="submit" value="Submit Choices">
  </select>

【问题讨论】:

您的代码应该正在检查错误。 【参考方案1】:

您的代码中至少有两个明显的错误,所以我将提供一个答案。我不能保证这能解决所有问题。

编写查询时所有列名的质量。

此外,您将值作为参数传递,因此您不需要单引号。

SELECT DISTINCT c.Choice_ID, s.name
From Sports s INNER JOIN
     Choices c
     ON c.Sport_ID = s.Sport_ID INNER JOIN
     Year y
     ON y.Year_ID = c.Year_ID
Where ?.Code Like CONCAT('%', :year, '%') AND
      ?.Current = 'Y' AND
      ?.Sex IN (:sex, 'B') AND
      ?.Term_ID = 3 AND   -- removed single quotes because I assume this is a number
      y.Year_ID=".$row['Year_ID']." ");

? 是相应表别名的占位符。我不知道这些列是从哪里来的,所以我不能添加它。不过,最后一个用于ON 子句。 Year_ID 至少在两个表中,所以引用不明确。

【讨论】:

【参考方案2】:

很棒的东西,几乎就是这样。在 c.Choice_ID 之后,s.name 需要大写为 s.Name。最后一个语句y.Year_ID=".$row['Year_ID']." "); 也不需要,因为它已经包含在语句INNER JOIN Year y ON y.Year_ID = c.Year_ID 中。

我的解决方案是:

$stmt = $conn->prepare(
      "SELECT DISTINCT c.Choice_ID, s.Name
      From Sports AS s INNER JOIN Choices As c
      ON c.Sport_ID = s.Sport_ID INNER JOIN Year As y
      ON y.Year_ID = c.Year_ID
      Where y.Code Like CONCAT('%', :year, '%') AND
      c.Current = 'Y' AND
      c.Sex IN (:sex, 'B') AND
      c.Term_ID = 3 ORDER BY Name ASC");
    $stmt->bindParam(':year', $_SESSION['year']);
    $stmt->bindParam(':sex', $_SESSION['sex']);
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
    
      echo("<option value='".$row['Choice_ID']."'>".$row['Name']."</option>");
    

【讨论】:

以上是关于联接 SQL 查询未能填充下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

下拉列表的 Ajax 和 SQL 填充

如何验证从 asp.net 中的 SQL 填充的下拉列表(UnobtrusiveValidationMode)错误

Select2 - Ajax 数据 - 根据查询填充下拉列表

查询数据库,分解日期以获取年份,并使用唯一年份填充下拉列表

由于查询量大,动态下拉列表混乱

如何从现有 SQL DB ASP.Net MVC 4 在下拉列表中填充数据