1

我已经挖掘了很多帖子,但在这里找不到像这样的场景......

我有一个 PHP 表单,其中包含一个下拉选择,其中包含来自 MySQL 数据库表的选项值。这部分工作正常。这里是我需要帮助的地方...

我需要使用来自同一数据库表的数据填充一个 textarea 字段,但需要使用不同的字段。该表包含一个“名称”和一组相应的“文本”。下拉列表显示“名称”作为选项。所以我需要的是,当进行选择时,脚本会运行(如 onChange)...获取所选值,查询数据库以获取与所选“名称”相关联的“文本”。然后,该“文本”将显示在 textarea 表单字段内。

这段代码供您查看的部分是:

echo "<form action=$PHP_SELF method=\"post\">\n";
echo "<select id=\"conditions\" name=\"conditions\">\n";
echo "<option value=\"Select\" selected>Select a Message</option>\n";

$result = mysqli_query($link, "SELECT * FROM db_scripts");
while ($data = mysqli_fetch_object($result)) {
    echo "<option value=".$data->script_id.">".$data->script_name."</option>\n";
}

echo "</select>\n";

echo "<br><textarea name=\"message\" style=\"width:300px; height:130px\" data-maxsize=\"160\" data-output=\"status1\" wrap=\"virtual\" maxlength=\"160\"></textarea><br />\n";

所以,就像我说的,这部分工作得很好。我有带有“script_name”作为选项的下拉菜单。现在我只需要将相应的消息放入 textarea 字段“消息”。非常感谢任何帮助!

4

3 回答 3

2

以这种格式在 PHP 中创建一个关联的 javascript 对象字面量数组:

<?php
echo "
<!-- this script goes in your <head> -->\n
<script>\n
var db_array = [";
$result = mysqli_query($link, "SELECT * FROM db_scripts");
$first = TRUE; // remove trailing comma from array
while ($data = mysqli_fetch_object($result)) {
  if ($first === TRUE) $first = FALSE;
  else echo ',';
  echo "
  {
    id: '$data->script_id',
    name: '$data->script_name'
    message: '$data->script_message'
  }";
}
echo "];\n
</script>";
?>

问题是,如果您的消息与 id 不在同一行,那么您需要JOIN在查询中使用。这部分背后的想法是您只查询数据库一次。您不希望客户端在每次切换下拉菜单中的选项时都查询数据库。这里的例外是如果您有兆字节以上的消息。在这种情况下,请考虑实施缓存措施。

继续......一旦你构建了数组,你可以<option>通过迭代数组来构建你的 s ,如下所示:

<?php
echo "
<form action=\"$PHP_SELF\" method=\"post\">\n
<select id=\"conditions\" name=\"conditions\">\n
<option value=\"Select\" selected>Select a Message</option>\n
<script>\n
for (var i = 0; i < db_array.length; i++) {\n
  document.write('<option value=\"'+db_array[i].id+'\">'+db_array[i].name+'</option>');\n
}\n
</script>\n
</select>\n
<!-- notice the id attribute I added -->\n
<br><textarea id=\"message\" name=\"message\" style=\"width:300px; height:130px\" data-maxsize=\"160\" data-output=\"status1\" wrap=\"virtual\" maxlength=\"160\"></textarea><br />\n";
?>

...然后有一个脚本可以访问这些动态创建的 DOM 元素(例如在<body>标签的末尾)

<script>
// returns the db_array index of the object id supplied
function returnIndex (id) {
  for (var i = 0; i < db_array.length; i++) {
    if (db_array[i].id === id) return i;
  }
  return -1; // returns index of -1 if id is not found
}
// changes the <textarea> message. notice the id I added to the messages <textarea> above
function changeMessage (id) {
  // remember to handle the case of an id not being found within db_array (where returnIndex returns -1)
  document.getElementById('message').innerHTML = db_array[returnIndex(id)].message;
}
// on the event that we switch options, do this event. realize that you'll have to run the changeMessage function once the page loads if you want the first option's message to show
document.getElementById('conditions').onchange = function() {
  changeMessage(this.selectedIndex);
}
</script>
于 2013-11-06T21:38:58.523 回答
1

您可以做的是将表单操作设置为GET. 然后,如果conditions设置了查询参数,则从数据库中选择相应的文本并将其显示为textarea. 所以使用PDOs

$text = "";
if(isset($_GET["conditions"])){
    $db->prepare("
        SELECT text
        FROM db_scripts
        WHERE script_name = ?
    ");

    $stmt->bindColumn(1, $type);
    $stmt->execute();
    $row = $stmt->fetch();
    if(!empty($row)){
        $text = htmlentities($row["text"]);
    }
);


echo "</form><textarea name=\"message\" style=\"width:300px; height:130px\" data-maxsize=\"160\" data-output=\"status1\" wrap=\"virtual\" maxlength=\"160\">$text</textarea><br />\n";
于 2013-11-06T21:45:37.637 回答
1

好的,我已经解决了这个问题......但最终没有使用任何其他答案。我试过了,尤其是 Jared 的那个。它让我非常接近,但最终并没有完全发挥作用。不过,我确实从 Jared 那里得到了一些非常有用的指导和想法!最后,我找到了一种更简单的方法来完成这项工作......

<head>1)从 Google中提取该区域的 JQuery 。那里没有加载其他脚本。

2)将此代码放在我的表单上方的PHP文件中,但在<?php>标签之外。

<script>
$(function () {
    $("#conditions").change(function() {
    $("#message").val($("#conditions").val());
   })
   $("#conditions").trigger("change");
})
</script>

3) 将下拉选择字段和 textarea 目标字段设置为...

$result = mysqli_query($link, "SELECT * FROM db_scripts");
$first = TRUE; // remove trailing comma from array
while ($data = mysqli_fetch_object($result)) {
$html_opts .= "<option value='".preg_replace('/[^a-zA-Z0-9\s]/', '', strip_tags($data->script_text))."'>".$data->script_name."</option>";   
}
echo '<select id="conditions" name="conditions">';
echo '<option value="" selected>Select a Script</option>';
echo $html_opts.'</select>';
echo '<br><textarea id="message" name="message" style="width:300px; height:130px" data-maxsize="160" data-output="status1" wrap="virtual" maxlength="16\"></textarea><br />';

当然,这里没有发布整个表格,但重要的部分是。现在这对我来说非常有用。希望它也可以帮助别人!

于 2013-11-08T18:39:12.847 回答