【问题标题】:Array into mysql database field [closed]数组到mysql数据库字段[关闭]
【发布时间】:2012-11-28 13:01:13
【问题描述】:

我有一组表单值,它们从一个页面发布到另一个页面。

$_POST['ingredients'];

数组中的项目以ingredients[]的形式发布。

我如何连接所有值并将它们放入数据库中一行的一个字段中

一个mysql代码的例子是完美的。

谢谢

$ingredient_method = $_POST['conValue'];
$ingredient_type = $_POST['OneWordDescription'];
$ingredient_element = $_POST['ingredients'];


$sql="INSERT INTO tbl_Recipe (recipe_id, ingredient_method, ingredient_type, ingredient_element)
VALUES
('',$_POST[conValue]','$_POST[OneWordDescription]','$_POST[ingredients]')";

if (!mysql_query($sql))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

【问题讨论】:

  • 目前这个问题的回答含糊不清。他们用你描述它的方式你只想连接所有的值并将它们放入数据库中一行的一个字段中。
  • 我该怎么做?谢谢@KellyCopley
  • 作为您正在寻找代码,这一切都取决于.. 就像我说的,这很模糊.. 您与 MySQL 交互的方式是什么?你真的只想要一个写着“Salt Sugar Water”的字符串吗?
  • 暂时是的,我可以在以后将它们编码到单独的表中。你看,我正在对它进行全文搜索。

标签: php mysql arrays forms post


【解决方案1】:

你有几个选择:

  1. 使用 PHP 的 serialize 函数将数组转换为字符串,然后将其放入数据库,然后在提取数据时使用 unserialize
  2. 使用 PHP 的 implode 将数据转换为字符串,然后在提取数据时使用 explode
  3. 在 MySQL 中创建另一个表,将每个值作为单独的行插入到数据库中,然后在查询中使用 INNER JOINLEFT JOIN 之类的内容提取数据。

更新

既然您已经发布了代码,我不得不建议您不要使用mysql_* 函数。它们已被弃用。使用mysqliPDO。此外,始终对您从用户收到的值使用 mysqli_real_escape_stringPDO::quote 以防止 SQL 注入攻击。

这是一个使用 serialize 和 PDO 的示例:

//get the array
$ingredient_method = $_POST['conValue'];
$ingredient_type = $_POST['OneWordDescription'];
$ingredient_elements = $_POST['ingredients'];
if(!is_array($ingredient_elements)) {
    //do some error handling
}

//connect to the database
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$pass = 'dbpass';
try {
    $pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

//serialize the string
$elements_str= serialize($ingredient_elements);

//prepare sql
$sql = 'INSERT INTO tbl_Recipe '.
           '(recipe_id, ingredient_method, ingredient_type, ingredient_element) '.
       'VALUES ( '.
            '"",'. //recipe_id
            $pdo->quote($ingredient_method).','.
            $pdo->quote($ingredient_type ).','.
            $pdo->quote($elements_str).
       ')';
// insert into database
$con->query($sql);

【讨论】:

  • 那就为sql注入攻击做好准备吧..请不要这样做!
  • @KellyCopley:只要他使用 msyqli_real_escape_string 或 PDO::quote,就不应该担心 sql 注入...这与 serializeunserialize 真的无关
  • 他在询问如何在数据库中存储一个数组,并要求提供一个 MySQL 代码示例。在我看来,他还没有牢牢掌握基础知识。我们不要假设他知道如何使用它,就给他一把上膛的枪。
  • @Kelly Copley 这怎么可能比在数据库中存储任何文本更危险?顺便说一句,刚刚看到 OP 的编辑,你对基础知识是绝对正确的......
  • 感谢您的回复,我已经更新了我的帖子。我想将这些值连接到一个字段中
【解决方案2】:

好的,不知道你是怎么把成分变成一个数组的,但是如果是这样的话,那么我们开始吧。

首先您可以使用 implode 加入数组,但检查是否有任何内容以避免引发警告。

//check if $_POST['ingredients'] is available if not then use empty string
$ingredient_element = isset($_POST['ingredients']) ? $_POST['ingredients'] : "";

join the array 
$ingredient_element = implode(" ", $ingredient_element);

现在您至少可以使用 mysql_real_escape_string 清理字符串,但我建议您了解 mysqli 或 PDO,因为不推荐使用 mysql_ 函数。

//sanitize
$ingredient_element = mysql_real_escape_string($ingredient_element);

然后只需在插入 sql 中使用 $ingredient_element

$sql="INSERT INTO tbl_Recipe (recipe_id,成分方法,成分类型,成分元素) 价值观 ('',$$ingredient_method','$ingredient_type','$ingredient_element')";

如果 recipe_id 是一个自动递增的整数 id,您可以将其留空,但如果您必须在此处使用某些内容,则必须使用 NULL 代替 ''

【讨论】:

  • 请不要使用 mysql_* 函数,因为它们已被弃用
  • 我想我在说这是至少可以做的事情之后提到了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 2018-01-17
  • 2013-12-31
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
相关资源
最近更新 更多