【问题标题】:Can't get dropdown to populate from MySQL database无法从 MySQL 数据库中获取下拉列表
【发布时间】:2012-12-22 03:55:33
【问题描述】:

我想创建一个简单的选择下拉菜单,由我的 MYSQL 数据库中的一个表填充。 这是我的代码:

$q = 'SELECT * FROM Shipmethods';
$result = mysqli_query($connection, $q);

echo '<select name="shipmethod">';

while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)); 
{   
    echo '<option value="' . $row['shipmethodid'] . '">' . $row['shipmethoddesc'] . '</option>';
}

echo '</select>';

mysqli_free_result($result); // free up the results

}

没有连接错误,表名或列名没有拼写错误。 HTML 输出显示存在一个选择选项,但它是空的。我想为此使用 mysqli。

似乎已经有无数关于这个主题的主题,但据我所知,我的代码与那些已经回答的问题的正确答案相匹配。

提前致谢。

【问题讨论】:

  • 你试过什么?您是否检查查询是否返回任何内容?我还建议您使用准备好的语句,因为您已经在使用 MySQLi。但是您应该在控制台、PHPMyAdmin 或任何您可以尝试的方式中尝试查询。 MySQL 可能会严重失败,但如果没有内置检查,您将永远不会在浏览器中知道它......只是没有结果。也许您可以使用print print_r($row, true); 发布$row 的内容。
  • 在while循环中添加print_r($row);,看看会返回什么
  • Swapnesh 做到了。但是,您的代码也存在“查询后忘记”的弱点。您查询,将结果存储在 $result 中,但您实际上并没有检查 $result。你应该有 if ($result) { // 现在尝试获取 } else { printf("Error: %s\n", mysqli_error($connection));当然,正如 Ian 指出的那样,查询也可以返回一个空的结果集。
  • @gview 只是使用我的调试知识,一开始我做了很多......现在帮助别人:)
  • 错误的分号不是问题。这会引发 Parse 错误。我敢肯定,要么查询被炸毁(输入错误的列名等),要么没有返回任何内容。

标签: php select drop-down-menu mysqli


【解决方案1】:

从这一行删除;,其余代码对我来说似乎很好,让我知道它是否有效--

while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)); 

while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC))

【讨论】:

  • 这不可能是转录错误。 PHP 会抛出一个Parse error: syntax error, unexpected '}' in blah.php on line x
  • @IanAtkin 我们只能提供一个指向解决方案的指针......因为我们不是主要读者......如果他禁止所有类型的警告/通知等......即使那样它也不会反映任何错误:)
  • @IanAtkin 没关系..我喜欢通过知识共享学到很多东西,你可能或实际上可能比我好:)
  • 不,不是更好。我刚刚收到很多查询,没有明显的原因。这就是为什么我提倡正确设置日志记录的原因。它可以节省几天的时间!
  • @Ian,不正确。它不会抛出错误,因为它不是语法错误。
【解决方案2】:

首先,根据我们掌握的证据,除了空结果集之外,最有可能的问题是 swapnesh 发现的问题,这显然是一个逻辑错误。我提供了这个插图,它模拟了这个问题,以明确说明这里意外完成的事情不是语法错误。错位的分号实质上导致只有在 while 循环耗尽后才能进入以下块。

考虑这个例子:

<?php

$r = array(1,2,3,4);

function fetchit(&$r) {
    return array_pop($r);
}


while ($val = fetchit($r))
{
    echo $val;
} 

这将是预期用途。现在如果脚本有这段代码会发生什么?

<?php

$r = array(1,2,3,4);

function fetchit(&$r) {
    return array_pop($r);
}


while ($val = fetchit($r));
{
    echo $val;
}

尝试这些,您将看到两个脚本都可以正常运行。虽然没有必要,但 php 并不关心您是否在脚本 {} 的某处随机包含一个不需要的块,并且它也不关心 if、while、for 等是否后面跟着一个块。事实上,人们缩短代码是一种常见的做法:

if (//somecondition)
    statement;

许多人不赞成这种做法,但它是合法的,程序员一直在使用它。

【讨论】:

  • 你是对的 - 它们运行没有错误并通过语法检查,但它确实让我的早晨变得混乱 :) 感谢您的进一步解释!实际上,在我在这里发布的代码中,为了更简洁,我省略了我的数据库连接信息和错误检查 - 下次我会确保全部添加。
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2014-07-20
相关资源
最近更新 更多