在数据库中的单个字段中存储多个输入值并单独检索

时间:2016-05-25 01:14:33

标签: php mysql mysqli

所以,我有一个这样的表格:

<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);
}

从DB获取值以在字段中显示:

$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&amp; 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();
?>

2 个答案:

答案 0 :(得分:2)

首先提出问题:

  • $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_*扩展程序。

答案 1 :(得分:0)

第一个也是最明显的答案更多的是一个问题:为什么要将它们全部存储在一个数据库列中?你可能有你的理由,但是再次检查它们,这不是标准的。通常会有一个数据库表,其中包含每个值的特定字段。

假设使用多个字段是不可能或不切实际的,您不能简单地将PHP数组抛入数据库并稍后将其取出。使用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://php.net/manual/en/mysqli.quickstart.prepared-statements.php - 使用mysqli_escape_string进行手动转义非常麻烦,而且很容易忽略以正确逃避所有内容。

您查询和使用while循环可能会找到具有给定用户名的多个用户。 while循环将经历这些,直到最后一个,然后继续到您的表单。如果公平地说你将只返回一行,只有一个用户将拥有给定的用户名,省去while循环并简单地获取一次数据。您可能还希望对查询设置LIMIT 1限制,在数据库中的列上添加唯一索引。

文档/进一步阅读