[英]Storing multiple input values in single field in database and retrieving separately
所以,我有這樣的形式:
<form action="edit.php" method="POST" id="content">
<h3>Homepage</h3>
<hr/>
<h4>Title: </h4><input type="text" name="UserData[]" value='$UserData[]'><br/>
<h4>Subtitle: </h4><input type="text" name="UserData[]" value='$UserData[1]'><br/>
<h4>Footer: </h4><input type="text" name="UserData[]" value='$UserData[2]'><br/>
<input type="submit" value="Save" name="datasave" id="save">
</form>
PHP提交:
if(isset($_POST['datasave']))
{
$data = $_POST['UserData'];
$Userdata = mysqli_escape_string($con, $data);
$query = "UPDATE users
SET UserData = '$UserData' WHERE Username = '$Username'";
mysqli_query($con, $query);
}
從數據庫獲取值以顯示在字段中:
$GetUserData = "SELECT UserData FROM users WHERE Username = '$Username'";
$UpdatedUserData= mysqli_query($con,$GetUserData);
if (! $UpdatedUserData){
echo "error";
}
while($row = mysqli_fetch_assoc($UpdatedUserData)){
$UserData = $row['UserData'];
}
我可能應該注意,我是PHP和mysql的新手(請多多包涵)。 問題是,這行不通,而且我顯然缺少了某些東西,並且沒有達到我可能做的那樣高效……如何獲取多個輸入的值並將它們存儲在同一個db字段中? 如您所見,我希望每個值在頁面加載時自動添加到它們各自的字段中。
編輯:我已經把這歸結為准系統(刪除其他代碼等),並進行了一些重組,這已經完成了! 現在來了解參數化查詢:D
<?php
require('config.php');
session_start();
$Username = $_SESSION['username'];
$GetUserData = "SELECT UserData FROM users WHERE Username = '$Username'";
$UpdatedUserData= mysqli_query($con,$GetUserData);
$row = mysqli_fetch_assoc($UpdatedUserData);
$data = json_decode($row["UserData"]);
foreach($data as $eachdata ) {
$UserData[] = $eachdata;
}
if ( $UserData ) {
echo '<form action="edit.php" method="POST" id="content">
<h3>Homepage</h3>
<hr/>
<h4>Title: </h4><input type="text" name="UserData[]" value="'.$UserData[0].'"><br/>
<h4>Subtitle: </h4><input type="text" name="UserData[]" value="'.$UserData[1].'"><br/>
<h4>Footer: </h4><input type="text" name="UserData[]" value="'.$UserData[2].'"><br/>
<input type="submit" value="Save" name="datasave" id="save">
</form>';
} else {
die("Error: {$con->errno} : {$con->error}");
}
if(isset($_POST['datasave']))
{
$data = json_encode($_POST['UserData']);
$query = "UPDATE users
SET UserData = '$data' WHERE Username = '$Username'";
mysqli_query($con, $query);
if (mysqli_query($con, $query)) {
header("Location: edit.php");
} else {
echo "Error updating record: " . mysqli_error($con);
}
}
if ( $con->connect_error ) {
die( 'Connect Error: ' . $con->connect_errno . ': ' . $con->connect_error );
}
$con->close();
?>
$Username
變量來自哪里?
您是否真的打算將數組存儲到users.UserData
列?
如果要繼續使用您的這種模式,則必須弄清楚如何將它們存儲到數據庫中。 如果在數組中使用*_real_escape_string()
會遇到錯誤。 第二個參數將查找字符串,而不是數組。
您可以嘗試全部運行它們,然后使用*_real_escape_string
,然后將其還原。
for($x = 0; $x < count($_POST["UserData"]); $x++){
$data[$x] = mysqli_real_escape_string($con, $data[$x]);
}
您是否將變量正確連接到HTML表單?
echo '<form action="edit.php" method="POST" id="content">
<h3>Homepage</h3>
<hr/>
<h4>Title: </h4><input type="text" name="UserData[]" value="'.$UserData[0].'"><br/>
<h4>Subtitle: </h4><input type="text" name="UserData[]" value="'.$UserData[1].'"><br/>
<h4>Footer: </h4><input type="text" name="UserData[]" value="'.$UserData[2].'"><br/>
<input type="submit" value="Save" name="datasave" id="save">
</form>';
@ChrisBaker涵蓋了存儲和檢索數據庫數據的其余部分。
但是,將此類數據存儲在數據庫中的明智方法是在數據庫中重組表。 將每個單獨的列:
您的users
表如下所示:
id | Username | title | subtitle | footer |
---+-------------+-----------+-----------+---------+
1 | LankyMoose | OP | English | sticky |
2 | Chris Baker | Boy Scout | English | dynamic |
3 | Logan Wayne | Whiner | Multi | none |
因此,您可以將它們存儲到數據庫中,並更輕松地獲取它們。
但是,如果這些字段是動態的呢? 您想存儲來自用戶的更多數據( 這是我嘗試插入來自用戶的數據數組時所想到的 )。
您可以創建額外的表,用於存儲來自用戶的不同類型的數據並存儲用戶的輸入。 讓我們命名第一個表,例如data_table
:
data_id | data_type
---------+-----------
1 | Title
2 | Subtitle
3 | Footer
然后,對於存儲用戶輸入的第二個表,將其命名為data_input
:
input_id | data_id | user_id | user_input
---------+---------+---------+------------
1 | 1 | 1 | OP
2 | 2 | 1 | English
3 | 3 | 1 | sticky
4 | 1 | 2 | Boy Scout
5 | 2 | 2 | English
6 | 3 | 2 | dynamic
7 | 1 | 3 | Whiner
8 | 2 | 3 | Multi
9 | 3 | 3 | none
您的users
表現在看起來像這樣:
user_id | username
--------+-------------
1 | LankyMoose
2 | Chris Baker
3 | Logan Wayne
因此,例如,您想從LankyMoose
獲取數據,可以嘗試以下查詢:
SELECT a.username,
c.data_type,
b.user_input
FROM users a
LEFT JOIN data_input b ON a.user_id = b.user_id
LEFT JOIN data_table c ON b.data_id = c.data_id
WHERE user_id = 1
結果將是:
username | data_type | user_input
------------+-----------+------------
LankyMoose | Title | OP
LankyMoose | Subtitle | English
LankyMoose | Footer | sticky
使用此方法,只需將數據插入data_table
即可添加更多字段。
我還建議您使用prepared statement
因為您已經在使用mysqli_*
擴展名。
第一個也是最明顯的答案是一個問題:為什么將它們全部存儲在一個數據庫列中? 您可能有自己的原因,但請再次檢查,這不是標准的。 通常會有一個數據庫表,其中包含每個值的特定字段。
假設無法使用多個字段或不切實際,則不能簡單地將一個PHP數組放入數據庫中並在以后取出它。 使用mysqli_escape_string
並沒有達到您的期望-顧名思義,它需要一個字符串,而您mysqli_escape_string
它一個數組。 您必須將PHP標量數組轉換為數據庫可以使用的東西,很可能是字符串。 您在那里有一些選擇。 您可以使用serialize
或json_encode
。 在這兩者中,我建議使用JSON。
如果將數組編碼為字符串,則當然必須將其轉換回PHP可以使用的值,並且必須對其進行解碼 。
編碼為JSON:
$data = json_encode($_POST['UserData']);
...並進行解碼:
$UserData = json_decode($row['UserData'], true);
您還可以通過如下制作字段來省去數字索引項:
<input type="text" name="UserData[title]" value=<?=($UserData['title'])?>>
如果我沒有提到您應該切換到參數化查詢,那我會很失落,否則您很容易受到SQL注入攻擊的影響。 查看更多: http : mysqli_escape_string
-使用mysqli_escape_string
手動轉義很麻煩,並且容易忽略以正確地轉義所有內容。
您的查詢和使用while循環使您有可能找到多個具有給定用戶名的用戶。 while循環將遍歷這些循環,直到最后一個循環,然后進入表單。 公平地說,您只會返回一行,只有一個用戶將具有給定的用戶名,省去了while循環,並且只需一次獲取數據。 您可能還希望對查詢設置LIMIT 1
限制, 並在數據庫的列上設置唯一索引。
文檔/進一步閱讀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.