【问题标题】:Database used to populate selection list用于填充选择列表的数据库
【发布时间】:2024-01-07 14:15:01
【问题描述】:

我正在尝试创建一个表单,并在该表单中有一个选择列表,其中的选项自动填充数据库中的数据(即客户的姓氏),之后从列表中选择姓氏并且提交按钮被点击,与数据库中的姓氏相关的“客户 ID”将被提交到另一个 PHP 文件 (task8.php) 以通过进一步的查询发送。我希望我已经以一种可以理解的方式解释了这一切。我已经尝试了一些代码,但我真的不确定如何执行此操作,或者我所写的内容是否正确。

这是我目前所写的:

<body>

<?php
$conn = mysql_connect("localhost", "twa312", "dam6av9a");
mysql_select_db("warehouse312", $conn)
or die ('Database not found ' . mysql_error() );

$sql = "select customerID, lastName from customer";
$rs = mysql_query($sql, $conn)
or die ('Problem with query' . mysql_error());

$options= '<option value="0">Choose</option>';

while ($row=mysql_fetch_array($rs)) {
$id=$row["customerID"];
$name=$row["lastName"];
$options="<OPTION VALUE='" . $id . "'>" . $name ."</option>";
}

?>

<form method="GET" action="task8.php" id="custinfo" >

Choose name:<select name="lname" id="lname"><?php echo $options; ?>  
</select>

<p><input type="submit" name="submit" value="Save Data"/>&nbsp;<input type="reset" value="Clear Form" />

</form>

我想要对代码执行的操作是访问“客户”表以及“客户 ID”和“姓氏”字段。使用客户的姓氏作为选项,使用客户的 ID 作为选择列表中的选项值。当前,当代码应该显示数据库中的所有名称时,该代码仅在选择列表中显示单个名称作为选项。对此的任何帮助都会非常棒,因为我不太确定。

【问题讨论】:

  • 真正的问题是什么?
  • 在 while 循环中打印您的选项。 1. php代码前的form、select等。 Fetch-while 循环 - 打印选项。关闭选择,形成
  • 抱歉,我收到一般的“服务器错误 HTTP 错误 500(内部服务器错误)”
  • 你可能想检查你的 Apache 错误日志,这可能暗示了问题
  • 我的代码好像没有错误?

标签: php database selection populate


【解决方案1】:

我可以看到代码中有一个错误会导致 PHP 生成通知错误。

while 循环中,您在尚未定义的$options 变量上使用.=,因此PHP 将对此表示反对。

除此之外,在从 mysql 迭代结果集之前等待设置 $_GET['submit'] 对我来说没有任何意义。据我所知,您第一次点击此页面时,选择中会有一个选项(“选择”),并且由于表单提交到不同的页面,我认为您不会看到客户姓氏列表。

最后,真的不建议将提交按钮命名为“提交”,因为当浏览器解析页面时,特定表单的所有表单元素都被创建为该表单的属性,JS 表单对象具有“提交” ' 方法,因此当您将输入命名为“提交”时,您会破坏表单对象中的该值,这使得使用 JS 提交该表单非常困难。

【讨论】:

  • 实际上,现在我真正查看了代码,您在while 循环中发现了一些解析错误。分配$id$name 的行需要以分号结束。
  • 谢谢!现在至少我可以看到我的表单,现在的问题是数据库中没有显示任何选项。
  • 在意识到你是对的并且没有任何意义之后,我也摆脱了 $_GET['submit']。
  • 正如我在回答中所说,这可能是因为您在迭代结果之前正在等待设置 $_GET['submit'],或者因为 $options 未初始化。在进入循环之前,将$options 初始化为您的“选择”选项。 $options = '&lt;option value="0"&gt;Choose&lt;/option&gt;';
  • 我已经更改了我的代码并设法从数据库中获取了一个值,但它只在选择列表中显示了一个名称而不是所有名称,如果您是,我已经对上面的代码进行了更改能够帮助我解决问题。
【解决方案2】:

首先远离mysql_functions。

其次,创建一个包含与您的客户相关的所有查询的模型,该模型将处理获取/放入/更新与您的客户数据库相关的数据。

<?php 
Class CustomerModel{
    private $db;

    function __construct($host,$dbname,$user,$pass){
        $this->dbhost = $host;
        $this->dbname = $dbname;
        $this->dbuser = $user;
        $this->dbpass = $pass;
    }

    private function connect(){
        if (!$this->db instanceof PDO){
            $this->db = new PDO('mysql:dbname='.$this->dbname.';host='.$this->dbhost, $this->dbuser, $this->dbpass);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
        }
    }

    public function select_all_customer($cols="*"){
        $this->connect();
        $sql = "SELECT $cols FROM customer";
        $statement = $this->db->prepare($sql);
        $statement->execute();
        return $statement->fetchAll(PDO::FETCH_ASSOC);
    }

    public function select_customer($cols="*",$where=null, $id=null){
        $this->connect();
        $sql = "SELECT $cols FROM customer WHERE $where = :id";
        $statement = $this->db->prepare($sql);
        $statement->bindParam(':id', $id, PDO::PARAM_STR);
        $statement->execute();
        return $statement->fetchAll(PDO::FETCH_ASSOC);
    }

}
?>

现在您可以像这样访问模型:

<form method="POST" action="task8.php" id="custinfo" >
Choose name:
<select name="customerID" id="customerID">
    <option value="0">Choose</option>
    <?php foreach($customer->select_all_customer("customerID, lastName") as $row): ?>
      <option value="<?php echo $row['customerID']?>"><?php echo $row['lastName']?></option>
    <?php endforeach; ?>
</select>
<p><input type="submit" name="submit" value="Save Data"/>&nbsp;<input type="reset" value="Clear Form" />
</form>


<?php 
//Get customer from form values
if($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['customerID'])){
    $result = $customer->select_customer("*", "customerID", $_POST['customerID']);
    //Do something with result
    echo '<pre>'.print_r($result, true).'</pre>';

}
?>

希望对你有帮助

【讨论】:

    最近更新 更多