首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组插入mysql (userCake)

将数组插入mysql (userCake)
EN

Stack Overflow用户
提问于 2015-02-19 16:15:12
回答 3查看 220关注 0票数 0

我正在构建一个关于userCake源代码的网站。此时,我想将一个数组插入到我的MySQL数据库中。

我从表单中获取数组的数据。这是构建数组的代码:

代码语言:javascript
复制
$pauzes = array();
    foreach($users as $usr)
    {
      $pauzes = array_merge($pauzes, array(
        $usr['username'] => $_POST[$usr['username']]));
    }

当我在此代码之后调用print_r($pauzes)时,可能的输出是:

数组( jules => 12.30-13.00 marc => 12.30-13.00 nick => 13.30-14.00 paulo => - kevin => - rick => - sanam => - yvette => -- bas => -布鲁斯=> -)

(“--”意思是没有选定时间)

按照userCake的工作方式,我必须使用bind_param,但不能发送数组(?)我找到了一些如何从数组中获取数据的代码,因此输出应该类似于用户名-time。

这是应该将数据写入数据库的函数:

代码语言:javascript
复制
function add_pauze($datum, $pauzes)
{
    GLOBAL $mysqli, $db_table_prefix;

    // array $pauzes opdelen in aparte stukken zodat deze kan worden opgeslagen in de database
    if(is_array($pauzes))
    {
        $data = array();
        foreach($pauzes as $row){
                $naam = mysqli_real_escape_string($mysqli,$row['username']);
                $tijd = mysqli_real_escape_string($mysqli, $row['tijd'] );
                $data[] = "($naam', '$tijd')";
        }
    }
    $stmt = $mysqli->prepare("INSERT INTO " . $db_table_prefix . "pauzes
                                                        (
                                                        datum,
                                                        gegevens
                                                        )
                                                        VALUES
                                                        " . implode(',', $data) ."
                                                        ");
    $stmt->bind_param("ss", $datum, $naam, $tijd);
    $result = $stmt->execute();
    $stmt->close();
    return($result);
}

当我现在尝试插入数据时,我会收到一些带有非法字符串偏移量的警告。我认为这是因为数组中没有定义$naam ($row‘’username)和$tijd ($row‘’tijd)?

我尝试将构建数组的代码更改为如下所示:

代码语言:javascript
复制
$pauzes = array();
    foreach($users as $usr)
    {
      $pauzes = array_merge($pauzes, array(
        "username" => $usr['username'] , "tijd" => $_POST[$usr['username']]));
    }

但我的阵列已经不对了:

数组(用户名=> bruce => -)

所以现在我想知道如何将我的数组(右一个在这个帖子的顶部)插入到我的数据库中。

提前感谢!

--更新信息--

我更改了构建数组的代码:

代码语言:javascript
复制
$pauzes = array("user" => array(), "pauze" => array());
    foreach($users as $usr)
    {
      array_push($pauzes['user'], $usr['username']);
      array_push($pauzes['pauze'], $_POST[$usr['id']]);

    }

当我执行print_r($pauzes)时,输出是:

阵列(用户=>数组( => jules 1 => marc 2 => nick 3 => paulo 4 => kevin 5 => Rick6 => sanam 7 => yvette 8 => bas 9 => bruce ) pauze => Array ( => 13.30-14.00 1 => -2 => -3 => 13.00-13.30 4 => -5 => 12.00-12.30 6 => -7-8-9-)

函数add_pauze被更新,如下所示:

代码语言:javascript
复制
function add_pauze($datum, $pauzes)
{
    GLOBAL $mysqli, $db_table_prefix;

    // array $pauzes opdelen in aparte stukken zodat deze kan worden opgeslagen in de database
    if(is_array($pauzes))
    {
        $data = array();
        foreach($pauzes as $row){
                $naam = $row['user'];
                $tijd =  $row['pauze'];
                $data[] = "('$naam', '$tijd')";
        }
    }
    $stmt = $mysqli->prepare("INSERT INTO " . $db_table_prefix . "pauzes
                                                        (
                                                        datum,
                                                        naam,
                                                        tijd
                                                        )
                                                        VALUES
                                                        " . implode(',', $data) ."
                                                        ");

    $stmt->bind_param("ss", $datum, $naam, $tijd);
    $result = $stmt->execute();
    $stmt->close();
    return($result);
}

当我在此函数中回显sql语句时,输出如下:

将值(“”、“”)、(“”、“”)插入applepauze( datum、naam、tijd )值

这是因为用户pauze索引都是未知的。

我的数据库中用于表applepauze的列是:

  1. id
  2. 基准
  3. 纳姆
  4. 蒂伊德

在naam中,需要存储用户的名称。在tijd中,中断时间(pauze)需要存储。

正如注释中所问的,当我执行print_r($datum)时,输出是:

2015-02-21 (编写本报告的日期)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-21 23:30:32

好的,首先,您使用的是准备好的语句,但绑定的值不正确。提供给mysqli::prepare的SQL应该如下所示:

代码语言:javascript
复制
INSERT INTO applepauzes (datum, naam, tijd) VALUES (?,?,?)

为每个用户重复使用(?,?,?)。然后使用mysqli::bind_param将数据绑定到这些值。不幸的是,mysqli::bind_param使您一次绑定所有参数,并接受可变数量的参数--每个param都要绑定一个参数,而且它们必须是引用的,这使得它更加烦人。

所以让我们看看你的数据..。为了运行SQL语句,我们最终需要的是一个如下所示的数组:

代码语言:javascript
复制
Array(
  0 => '2015-02-21',
  1 => 'juels',
  2 => '12.30-13.00',
  3 => '2015-02-21',
  4 => 'marc',
  5 => '12.30-1:00'
  // repeat for each user in the same order
)

但是,为了正确地处理查询,我们需要安排如下内容:

代码语言:javascript
复制
Array (
   0 => array(
      0 => '2015-02-21',
      1 => 'juels',
      2 => '12.30-13.00'
   ),
   1 => array(
      3 => '2015-02-21',
      4 => 'marc',
      5 => '12.30-1:00'
   ),
   // repeat for every user record
)

我假设$_POST看起来类似于:

代码语言:javascript
复制
Array(
   'juels' => '12.30-13.00',
   'marc' => '12.30-13.00',
   // etc
)

所以我们需要做的第一件事是正确地组织这个:

代码语言:javascript
复制
$pauzes = array();
foreach ($users as $u) {
   $username = $u['username'];
   // if a user has an entry in the Form then add it to 
   // $pauzes array for insert into the DB
   if (isset($_POST[$username]) {
      // even though we want numeric keys eventually we
      // we will use the field names here so that its not ambiguous
      // later and we can easily reorder them
      $pauzes[] = array(
          'naam' => $username,
          'tijd' => $_POST[$username]
      )
   }
}

// call out function
add_pauzes(date('Y-m-d'), $pauzes);

所以现在我们进入了问题的核心..。使用mysqli的实际插入

代码语言:javascript
复制
// add an array typehint so that the function
// only takes an array
function add_pauze($datum, array $pauzes)
{
    GLOBAL $mysqli, $db_table_prefix;

    // first we need to prepare our base array structure
    $records = array();
    $params = array();
    
    foreach ($pauzes as $pauze) {
        $prefix = $pauze['username'];
        // give the items unique keys so we can reference them 
        // in the flat array $params
        $records[$prefix] = array(

           $prefix . 'datum' => $datum,
           $prefix . 'naam' => $pauze['username'],
           $prefix . 'tijd' => $pauze['tijd']
        );

        
        $params = array_merge($params, $records[$prefix]);
    }

    print_r($params);

    // get our total number of records for insertion
    // eg. each array in $records represents a set of values
    // for a db record in the table
    $recordCount = count($records);

    // create placeholders (?,?,?), one for each $record element
    $placeholders = array_fill(0, $recordCount, '(?,?,?)');

    // create the SQL string for our insert using
    // sprintf will substitute our the %s for the other arguments
    // we give it...    
    $sql = sprintf(
        'INSERT INTO %spauzes (datum, naam, tijd) VALUES %s',   
        $db_table_prefix,
        implode(',', $placeholders)
    );

    // prepare out statmement
    $stmt = $mysqli->prepare($sql);

    // we have to use references to bind the params
    // and to make it easy we want to do so with call_user_func_array
    // so establish an array of arguments the first being the param
    // type and then so loop over $params and assign the values to
    // $args by reference
    $args = array(str_repeat('s', count($params)));
    foreach ($params as $k => &$v) {
        $args[$k] = &$v;
    }

    // bind all of our params using a callable and an array
    // of arguments to be passed into that callable
    call_user_func_array(array($stmt, 'bind_param'), $args);

    $result = $stmt->execute();
    $stmt->close();
    
    return $result;
}
票数 0
EN

Stack Overflow用户

发布于 2015-02-21 23:16:09

我解决了我的问题。

我将构建数组的代码更改为:

代码语言:javascript
复制
$pauze_users = array("users" => array());
$pauze_tijd = array("tijd" => array());
foreach($users as $usr)
{
  array_push($pauze_users, $usr['username']);
  array_push($pauze_tijd, $_POST[$usr['id']]);

}

在此之后,我将确保数据在SQL语句中与以下代码放在一起是正确的:

代码语言:javascript
复制
$count_users = count($pauze_users);
$sql;
                for($i = 0; $i < $count_users; $i++)
                {
                    $sql .= "(" . $datum . ", " . $pauze_users[$i] . ", " . $pauze_tijd[$i] . ") ";     
        }

使用此代码,我将得到如下输出:

(2015-02-22,jules,11.30-12.00) (2015-02-22,marc,12.30-13.00) (2015-02-22,nick,-) (2015-02-22,保罗,12.0-12.30) (2015-02-22,kevin -) (2015-02-22,rick --) (2015-02-22,sanam --) (2015-02-22,yvette,

(我知道我需要将<<,>>放在数据之间,以使其为SQL所接受。

我想感谢你帮助解决我的问题!

票数 0
EN

Stack Overflow用户

发布于 2015-02-22 19:39:37

如果您只想在MySQL表中插入一个数组(或任何任意的PHP结构)并能够将其取出,那么请考虑以下几点。注意:您将无法通过SQL语句轻松地检查任何数组元素。

将此添加到您的表中:

代码语言:javascript
复制
json TEXT NOT NULL COMMENT 'opaque array of stuff'

使用json_encode($array)将数组转换为字符串,然后将该字符串插入到json列中。

在将SELECTing json列放入$json后,执行以下操作以使数组返回:

代码语言:javascript
复制
$array = json_decode($json, true);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28611288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档