【问题标题】:save all html select box contents to sql server table将所有 html 选择框内容保存到 sql server 表
【发布时间】:2018-08-21 20:53:28
【问题描述】:

编辑:请在下面找到我的解决方案

我在一个表格中有两个选择框,我从两个不同的表中填充。 SELECT1 显示客户特定的选项。 SELECT2 显示所有可用选项,除了那些已经在 SELECT1 上的选项

填充它们,将项目从一个移动到另一个等一切正常。

我不知道如何在提交 FORM 后将 SELECT1 的那些项目存储回数据库。 对于该 SELECT 框中的每个项目,我需要检查它是否已存在于 MY_TABLE_2 中,如果不存在,则将其存储。

当我检查 var_dump(SELECT1) 时,我只看到最后一个选定项目的值,但它通常在 SELECT1 中包含多个项目。

现在我正在为将在 MY_TABLE_1 上进行的所有其他字段调用存储过程,这没关系。 如果出现错误,我将需要执行一些更新两个表或回滚的事务。如果我只存储一件物品,那就可以了。

但是我如何将所有项目发送到存储过程。

有什么帮助或线索吗?

如果可以帮助理解,这里是一个打印屏幕:

生成表单的代码:

echo '<select name="ed_clilabelcodes" id="ed_clilabelcodes" style="width: 200px" multiple>';
while($row = sqlsrv_fetch_array($dvclilablist)){
  echo '<option value="'.$row[0].'">'.$row[0].' - '.$row[1].'</option>';
}
echo '</select>';

-----------我的解决方案-----------

任何这些选择框中的所有项目都存在于由字段 OptCode 标识的表 (dbo.MyItems) 中。 我真正需要的是存储那些由特定客户选择的物品。 我正在考虑使用第二张表来存储这些项目,但实际上我是在复制信息,我认为这不是最好的解决方案。

由于我真的只需要附加到客户端文件的那些选定代码,因此我执行了以下操作:

我有一个受HERE 启发的javascript 函数,它允许我在两个选择框之间移动项目,顺便说一下,从HERE 创建一个对框中的项目进行排序的函数。 每次我从客户端的列表框中添加或删除项目时,我都会立即调用排序函数,因此我只需使用选择框中的所有项目值(代码)更新隐藏的输入值,然后立即调用此 javascript 函数:

function RecheckCodes() {
  var vlist = document.getElementById("ed_clilabelcodes");
  var vlabcodes = "";
  var i;
  for (i = 0; i < vlist.length; i++) {
    if (i == 0) {
      vlabcodes = vlabcodes + "\'" + vlist.options[i].value + "\'";
    }
    else {
      vlabcodes = vlabcodes + ",\'" + vlist.options[i].value + "\'";
    }
  }
  document.getElementById("v_clilabcodes").value = vlabcodes;
}

在 FORM Post 上,我只是将该字符串保存在客户端字段中。

之后我可以使用以下 2 个存储过程重新填充框以进行编辑以获取项目(第一个 SQL 将获取带有代码的字符串,并从第二个从项目表中获取项目描述的 SQL 调用)。

ALTER PROCEDURE [dbo].[DavGetOptCodeByClient] 
  @vclicode nvarchar(12),
  @vopttype nvarchar(12),
  @voptcodes nvarchar(300) OUTPUT
AS
BEGIN
  SET NOCOUNT ON;
  SELECT @voptcodes = optcodes
  FROM   dbo.dav_client_options
  WHERE  clinumber = @vclicode AND opttype = @vopttype
END



ALTER PROCEDURE [dbo].[DavGetOptDetailByClient] 
  @vclicode nvarchar(12),
  @vopttype nvarchar(12)
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @v2optcodes nvarchar(1000)
  DECLARE @vsql nvarchar(1000)
  exec dbo.DavGetOptCodeByClient @vclicode,@vopttype, @v2optcodes OUTPUT
  SET @vsql = 'SELECT optcode, optdetail ' +
            'FROM dbo.dav_global_options ' +
            'WHERE ("optcode" IN ('+@v2optcodes+')) AND (opttype = '''+@vopttype+''')'
  EXEC sp_executesql @vsql
END

所以即使我确信可以对代码进行一些改进,一切都可以满足我的需要。

【问题讨论】:

  • 您可以使用表值参数,或者不太理想的方法是为列表中的每个项目调用您的过程。
  • 一个图像可能会说一千多个单词。可能。在这种情况下,我更喜欢生成表单的 php 和处理发布数据的 php。
  • 也许您可以复制两个表中的所有项目,在两个表中添加一个数量列。然后你可以只改变数量 - 它应该更容易。您也可以只使用一个表来完成此任务,将 Select# 列添加到其中。如果两个选择不能有相同的值,您可以简单地更改每个值的 Select# ID。
  • @GerardH.Pille,将处理将“客户端标签”框中的这 3 个元素传递给存储过程的 php 是我也在寻找的那个。其余所有工作正常。我在玩使用 javascript 的想法,我必须将项目从一个盒子移动到另一个盒子,让它将所有项目值提供给一个 var,用逗号分隔,然后将它发送到 SQL 存储过程,但是有没有办法然后将其拆分为每个单独的代码并读取“所有标签”表中的每个元素并将它们插入到 MY_TABLE_2?
  • 可以使用分隔数据。你用的是什么版本的sql server?

标签: php html sql-server


【解决方案1】:

为了能够发送所有元素,最简单的选项是选择它们,它们在列表中是不够的,但它们必须被选中,因为它必须激活选择的“多个”选项,一旦通过按“control”或“shift”键完成此操作,您就可以在列表中进行多项选择。

<form action="#" method="post">
        <select name="Color[]" multiple> <!--the option multiple must be active and be array -->
            <option value="Red">Red</option>
            <option value="Green">Green</option>
            <option value="Blue">Blue</option>
            <option value="Pink">Pink</option>
            <option value="Yellow">Yellow</option>
        </select>
        <input type="submit"  value="Get Selected Values" />
    </form>

另一种选择是在 html 中添加这个小 javascript (jQuery),这样您在选择多个选项时不必按下、控制或切换,只需单击即可被选中

$('option').mousedown(function(e) {
    e.preventDefault();
    $(this).prop('selected', !$(this).prop('selected'));
    return false;
});

来源:How to avoid the need for ctrl-click in a multi-select box using Javascript?

最后你用一个简单的 php 得到你的数据

<?php
$data=$_POST;
if($data) {
    foreach ($data['Color'] as $option) {
        echo $option;
    }
    var_dump($data);
}
?>

【讨论】:

  • 谢谢,试试这个。
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2011-07-27
相关资源
最近更新 更多