2016-01-20 45 views
1

我試圖插入一個新的行到我的數據庫的幫助下的一個PHP窗體。MySQL將值添加到SET元素

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> 

注意在這一點上,這是一個多選的形式。(一個人可以說超過1種語言)

然後,使用php我得到的數值爲表中的每個元素,但對於一個我最感興趣的我做到以下幾點:

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

我這裏所說的implode方法的原因是,所以我得到一個字符串返回以下形式:ex.'english','greek'但是,這是MySQL的不是如何接受設置要這樣初始化,我更換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。我錯過了什麼?

對不起,很長的文章。

+0

您並未解決數據的安全問題,更不用說將數據存入表格。你應該使用[準備語句](http://stackoverflow.com/questions/9629328/how-to-use-mysqli-prepared-statements-in-php)而不是 – Machavity

+2

除此之外,它不是很好的做db查詢的方法回答你的問題'$ qlanguages'已經'''圍繞它了。你應該做'... VALUES('$ qfirst_name','$ qlast_name',$ qlanguages)「;' – manRo

回答

2

你這樣做:

$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'')"; 

,你可以看到 「雙」 「單」 引號代替語​​言

+0

你不知道,這個問題已經困擾我多久了......感謝一個很好的SIR。一個新手的錯誤,但我仍然是一個本科生:) – Jack

0

SET數據類型是stored internally as a binary digit。 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列。現在我會建議使用單獨的語言表。

+0

單獨的語言表是3NF(我認爲),這就是爲什麼我認爲它更好,我想這幾個小時前,當我無法找出手頭的SET問題。 – Jack