【问题标题】:Option tags not showing up when generated by PHP由 PHP 生成时选项标签不显示
【发布时间】:2021-04-19 22:21:50
【问题描述】:

我目前正在开发一个日历网站,其功能之一是管理员应该能够为其他人创建预订。为了尝试和重用网页,我想动态地这样做;如果他们是管理员,则应显示一个选择框,否则用户自己的名称应显示为静态文本。

为此,我编写了以下 PHP sn-p:

<?php

// Be sure that we included the msql lib
include_once($_SERVER["DOCUMENT_ROOT"] . "/assets/php/intern/msql.php");

if ($user_info["admin"]) {
    // If the user is an administrator, then show the picker

    // First, get a list of all (possible) users
    $users = msql_fetch(msql_start(), "SELECT * FROM users WHERE role <= ?",
                        $user_info["role"]);
    if (count($users) == 0) {
        // That's weird; should be at least the logged-in user
        echo("<span style='color: #FFFFFF;font-weight: bold;'>Error; herlaad de pagina</span>");
    } else {
        // Generate a list of options from this list
        $options = "";
        foreach ($users as $user) {
            // Typify that user
            $user = typify_user($user);

            // Generate the option
            $options = $options . "<option value=\"" . $user["id"] . "\"";
            // If this is the present user (which is guaranteed to exist, I'd say), then set it as default
            if ($user["id"] === $user_info["id"]) {
                $options = $options . " selected";
            }
            $options = $options . ">" . $user["name"] . "</option>";
        }

        // Generate the actual div
        echo(
            "<select id=\"home-create-reservation-name\" style=\"padding: 5px;color: #22CC00;font-weight: bold;\">" .
            $options .
            "</select>"
        );
    }
} else {
    // Otherwise, show the user's name statically
    echo("<span id='home-create-reservation-name' style='color: #22CC00;font-weight: bold;'>" . $user_info["name"] . "</span>");
}

?>

sn-p 似乎可以工作,因为如果用户是管理员,它会成功生成一个选择元素,如果用户不是,它会成功生成一个静态名称范围。

但是,我遇到的问题是选项元素未正确添加,而是选择框显示为空:

empty select box

为了增加谜团,这是 Firefox 的检查器显示的代码:

<select id="home-create-reservation-name" style="padding: 5px;color: #22CC00;font-weight: bold;">webmaster</select>

但 Firefox 接收的原始源内容是:

<select id="home-create-reservation-name" style="padding: 5px;color: #22CC00;font-weight: bold;"><option value="1" selected>webmaster</option><option value="17">lut_99</option><option value="19">dummy</option></select>

事实上,如果我将其复制/粘贴为检查器中同一选择的 HTML 内容,然后选择会突然正常运行并显示所有三个用户帐户。

不过,我应该注意,因为我使用的是 Firefox,并且只有在登录时才能访问此页面,所以我不能直接使用“查看源代码”,而是复制 Firefox 发出的第一个 HTTP 请求的响应。我认为这不应该是一个问题,但是如果是,请告诉我。

我觉得我犯了一个非常简单和愚蠢的错误,但我就是不知道它是什么。添加“名称”属性也无济于事,也没有将 HTML 引号更改为 PHP sn-p 中的单引号。

谁能看到这里出了什么问题?如果您需要更多信息,请告诉我。

谢谢!

【问题讨论】:

  • “不过,我应该注意,因为我使用的是 Firefox,而且这个页面只有在登录时才能访问,所以我不能直接使用‘查看源代码’” - 为什么不呢,你的登录基于什么?
  • 如果浏览器实际上收到了正确的 HTML 代码开始 - 那么也许其他东西在你的选择字段之后弄乱了,也许是一些 JavaScript ......?
  • 我不能使用视图源,因为对我来说,视图源似乎不像 PHPSESSION cookie 那样发送 cookie。在任何情况下,网络服务器都会将我重定向到登录页面 - 而这就是我看到的 HTML。
  • 另外,你是我的英雄——我查看了我的 Javascript,发现确实有一条旧行,从我以前在 Javascript 中加载它时开始,将元素的文本设置为用户名。 .. *facepalm* 非常感谢!编辑:据我了解,我只能将实际答案标记为答案-因此,如果您这样做,我可以将您的回复标记为:)

标签: php html firefox select option


【解决方案1】:

嗯...我将其更改为符合我自己网站的规则,我看到您使用的是mysql_fetch()。首先应该是mysqli_fetch(),或者mysqli_fetch_assoc()。但是,这里的主要问题是您正在搜索单个用户。 mysqli_fetch() 不会返回整个查询(您可以使用 var_dump($reply)print_r($reply) 来找出答案)。您应该使用带有查询变量的 while 循环:

$q = $db -> query("SELECT * FROM users WHERE role <= ?" . $user_info["role"]);
while ($user = mysqli_fetch_assoc($q)){
    //Do the select and options stuff here
}

我在自己的网站上尝试过,不再有问题。只是,&lt;select&gt; 的加载需要一点时间(我不知道为什么,但这只发生了一次)。

那么,这到底是做什么的呢?此 while 循环每次都获取一次查询。如果使用一次,mysqli_fetch_assoc() 函数只返回第一行。如果您稍后再次使用它,它会返回下一行。我希望我有所帮助,而且我通常在线回答可能的问题(关于任何更复杂的事情)。

【讨论】:

  • 抱歉,我弄糊涂了,但是我写了自己的 PDO 包装器并将其称为 msql_fetch() 等以避免输入很多内容:) mysql 函数因此不是问题。实际问题已经在 cmets 中讨论并解决了 - 但我无法将其标记为答案......不过,感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多