繁体   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