【问题标题】:Mysql INSERT SET typeMysql INSERT SET 类型
【发布时间】:2017-05-28 06:02:56
【问题描述】:

对不起,我的英语不是我的母语。 我创建了一个用户界面来将数据插入 MySQL。除了一件事之外的一切都可以,但是当我想从多个复选框中读取数据并将它们写入 MySQL 中的 SET 类型时,它就不起作用了。我试图找到答案,但 4 小时后我找不到或不明白。

http://jyxo.info/uploads/21/21b104df77f6ca723bb708d8d0549af5430e8e91.jpg

dobaVyskytu 是 SET 类型,有月份你可以找到蘑菇(我的主题是蘑菇在线图集)

在用户界面中,我有 12 个月的 12 个复选框。

http://jyxo.info/uploads/FD/fd548760b155307dfa677ada7c4be4996abf7b93.png

在 dobavyskytu 中,我需要进行多项选择,这就是我使用 $doba +=

的原因
if(isset($_POST["Leden"]))
{
    $doba += "Leden";
}

if(isset($_POST["Únor"]))
{
    $doba += "Únor";
}

if(isset($_POST["Březen"]))
{
    $doba += "Březen";
}


Db::query("INSERT INTO houby(nazev,dobaVyskytu,mistoVyskytu,popis,jedovatost,img)VALUES(?,?,?,?,?,?)",$nazev,$doba,$misto,$popis,$jedovatost,$foto);

感谢大家的阅读和帮助,因为它现在有效。

【问题讨论】:

  • 看看How to Ask。您应该描述会发生什么,您期望发生什么,它们有何不同,最好提供minimal reproducible example
  • $doba 是您的 SET 字段吗?你为什么用$doba += "Únor"而不是$doba = "Únor"?
  • 你使用 PHP 吗?
  • 显示 Db::query 函数

标签: php mysql set sql-insert


【解决方案1】:

对于 PHP 中的字符串,它使用. 作为连接而不是+,所以

$doba .= "Leden";

编辑: 为了更好地执行此操作,您应该尝试类似...

$options = [];
if(isset($_POST["Leden"]))
{
    $options[] = "Leden";
}

if(isset($_POST["Únor"]))
{
    $options[] = "Únor";
}
...
$doba = implode(',', $options);

因为这会给你类似Leden,Únor

【讨论】:

  • 当我这样做时会收到一条消息解析错误:语法错误,第 37 行的 /w/halama/mysql/houby/library.php 中出现意外的“[”,这就是 $options = [] ;
  • 取决于 PHP 的版本 - 将其更改为 $options = array();
【解决方案2】:

我的假设是:

  • $doba 是您要在 SET 类型列中插入的变量(我翻译了,您在问题中作为示例输入的值似乎是斯洛伐克语,表示“一月”、“二月”、“三月”- - 我想可能还有更多)。

  • 我假设您的 SET 类型列是“dobaVyskytu”,并且您通过在列定义中包含所有可能的值在 MySQL 中正确创建了它。

(您的问题更新似乎证实了我的假设!)

首先,当你想在 MySQL 的一个 SET 类型的列中插入多个值时,字符串值必须用逗号分隔。

使用我看到的代码,你可以得到那个字符串“LedenÚnorBřezen”(我想你使用 += 进行字符串连接,但你真的应该使用 .= 就像 Nigel Ren 提到的那样)。如果您在表单中检查了您显示的所有 3 个值,您真的希望得到一个像“Leden,Únor,Březen”这样的字符串。

查看这里了解如何在 MySQL 中处理 SET 类型: https://dev.mysql.com/doc/refman/5.7/en/set.html

由于您不知道该列的最终值是 0 还是多个,我建议将 $doba 设为一个数组。

$doba = array(); // depending on your PHP version, you can also write $doba = [];

之后,您可以通过这种方式添加您的值(语法 $array[] = 'value' 会将一个值附加到数组中):

$doba[] = "Leden";
$doba[] = "Únor";
$doba[] = "Březen";

然后,在插入之前,您可以将数组转换为字符串,其值以逗号分隔:

$csvDoba = implode(',', $doba);

然后在 Db::query() 行中使用 $csvDoba 而不是 $doba。


完成这项工作后,您可以通过以下方式改进代码:

  • 您还可以通过使用特殊名称命名表单复选框来利用 PHP 魔法以避免重复。

    例如,您可以将所有复选框命名为“doba[]”,如果 (isset($_POST["doba"]),它将已经是一个包含所有检查值的数组!但请注意,如果未选中任何值,则不会设置它。这样,您将避免为每个复选框执行 if 条件。

    您可以在代码中执行类似的操作来检索值:

    $doba = isset($_POST['doba']) ? (array) $_POST['doba'] : array();

    这是做什么的?

    如果选中了任何名为“doba[]”的复选框,那么您将检索它们并确保您检索的值是数组类型,“(数组)”部分的值是一个数组,即使它是不是(例如,错误或有人试图破解您的表单)。否则,您将返回一个空数组(因为没有放置任何选项)。

    如果您不熟悉此语法,请搜索“三元运算符”。

  • 如果还没有完成,您当然会想要对您的值进行一些验证

  • 您可能希望将值放在另一个表中,而不是使用“SET 类型”,但这取决于您,在这个阶段您可能还有一些东西要学习,所以我不想用太多信息淹没你。 ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2011-09-18
    • 1970-01-01
    • 2013-01-18
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多