簡體   English   中英

將多個輸入值存儲在數據庫的單個字段中並分別進行檢索

[英]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標量數組轉換為數據庫可以使用的東西,很可能是字符串。 您在那里有一些選擇。 您可以使用serializejson_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限制, 在數據庫的列上設置唯一索引。

文檔/進一步閱讀

  • json_encode - http: json_encode
  • json_decode - http: json_decode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM