繁体   English   中英

MySQL将值添加到SET元素

[英]MySQL add values to SET element

我试图借助php表单在数据库中插入新行。

CREATE TABLE person (
first_name      VARCHAR(30) NOT NULL,
last_name       VARCHAR(30) NOT NULL,
languages       SET('english', 'greek', 'german', 'japanese', 'spanish', 'italian', 'french', 'wookie', 'klingon', 'other') NOT NULL,
pid             INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(pid)
);

首先,我有上面的MySQL表。

然后,使用以下代码,我将获得所有内容的字段值

<form class="sform" method="post">
<input type="text" name="first_name" value="" placeholder="First name" maxlength="30">
<input type="text" name="last_name" value="" placeholder="Last name" maxlength="30">
<select multiple="multiple" id="languages" name="languages[]">
                <option value='english'>English</option>
                <option value='greek'>Greek</option>
                <option value='german'>German</option>
                <option value='japanese'>Japanese</option>
                <option value='spanish'>Spanish</option>
                <option value='italian'>Italian</option>
                <option value='french'>French</option>
                <option value='wookie'>Wookie</option>
                <option value='klingon'>Klingon</option>
                <option value='other'>Other</option>
            </select>
</form>

请注意 ,这是多选形式。(一个人可能说一种以上的语言)

然后,使用php获取表中每个元素的值,但是对于我最感兴趣的那个,我执行以下操作:

$qfirst_name     = $_POST['first_name'];
$qlast_name      = $_POST['last_name'];
$qlanguages      = "'" . implode("','", $_POST['languages']) . "'";

我在这里调用implode方法的原因是,我以以下形式返回了一个字符串: ex.'english','greek'但是,这不是MySQL接受SET初始化的方式,因此,我将single quotes替换为所以:

$qlanguages = str_replace('\'', '', $qlanguages);

现在,$ qlanguages将是: ex.english,greek但这还不够接近,所以最后一步是在变量的开头和结尾都加上引号 ,如下所示: $qlanguages = '\\''.$qlanguages.'\\'';

最后,$ qlanguages的正确格式为'english,greek' ,可使用以下代码插入数据库:

$sql1 = "INSERT INTO person (first_name, last_name, languages) 
         VALUES ('$qfirst_name', '$qlast_name', '$qlanguages')";

然后,我连接到我的数据库,以便将条目添加到数据库中。 注意,这里有另一个文件建立了连接,我只是包括在php文件的顶部。

if ($dbconn->query($sql1)) {
    echo "SUCCESS";
}
else {
    echo "FAIL";
}

我已经尽力解释了我的步骤,我的问题是:为什么当我在查询中包含SET字段时,无法在数据库中插入新person 我想念什么?

抱歉,很长的帖子。

您这样做:

$qlanguages = "'english,greek'";
$sql1 = "INSERT INTO person (first_name, last_name, languages) 
     VALUES ('$qfirst_name', '$qlast_name', '$qlanguages')";

所以你得到了这个:

$sql1 = "INSERT INTO person (first_name, last_name, languages) 
     VALUES ('qfirst_name', 'qlast_name', ''english,greek'')";

您可以在语言中看到“双”,“单”引号

SET数据类型在内部以二进制数字存储 IIRC您可以利用这一事实,而无需进行所有字符串操作。 另外,如果您将我放在该网页的前面5秒钟,我可能会删除您的数据库。 您应该使用准备好的语句来减轻SQL注入攻击的风险。

<form class="sform" method="post">
<input type="text" name="first_name" value="" placeholder="First name" maxlength="30">
<input type="text" name="last_name" value="" placeholder="Last name" maxlength="30">
<select multiple="multiple" id="languages" name="languages[]">
                <option value='1'>English</option>
                <option value='2'>Greek</option>
                <option value='4'>German</option>
                <option value='8'>Japanese</option>
                <option value='16'>Spanish</option>
                <option value='32'>Italian</option>
                <option value='64'>French</option>
                <option value='128'>Wookie</option>
                <option value='256'>Klingon</option>
                <option value='512'>Other</option>
            </select>
</form>


<?php
$qfirst_name     = $_POST['first_name'];
$qlast_name      = $_POST['last_name'];
$qlanguages      = array_sum($_POST['languages']);

$stmt = $dbconn->prepare("INSERT INTO person (first_name, last_name, languages) VALUES (?, ?, ?)");
$stmt->bind_param("ssd", $qfirst_name, $qlast_name, $qlanguages);
if ($stmt->execute($sql1)) {
    echo "SUCCESS";
}
else {
    echo "FAIL";
}
?>

未经测试,但是几年前我很愚蠢到可以使用SET列时,我做了类似的事情。 现在,我建议使用单独的语言表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM