Mysql INSERT SET类型

时间:2017-05-28 06:02:57

标签: php mysql set sql-insert

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

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

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

在用户界面中有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);

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

2 个答案:

答案 0 :(得分:1)

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

$doba .= "Leden";

编辑: 为了更好的方法,你应该尝试类似......

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

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

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

的东西

答案 1 :(得分:0)

我的假设是:

  • $ doba是您想要在SET类型列中插入的变量(我翻译了,您在问题中放置的值似乎是斯洛伐克的“1月”,“2月”,“3月” - - 我想可能会有更多)。

  • 我认为您的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'])? (数组)$ _POST ['doba']:array();

    这是做什么的?

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

    如果您不熟悉这种语法,请为“三元运算符”进行搜索。

  • 如果尚未完成,您当然希望对您的值进行一些验证

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