php将未知数量的值传递给mysql准备好的语句

时间:2014-10-29 22:41:04

标签: php mysql arrays

我一直在谷歌搜索过去几个小时的解决方案,但没有任何东西符合我的需要。如果数组具有与数据库列匹配的键,则这些insert array with keys有效,insert array如果列匹配值(将每个列绑定到一个值)以及其他类似但无法找到的值,则此方法有效任何适合我情况的东西。

我有一个通过jquery多重选择选项发布的数组,然后将其存储在$eng中并传递给函数。

这是 var_dump $ eng (数组)的结果。

  

{[0] => array(3){[0] => string(5)“Games”1 =>串(5)   “音乐”2 => string(4)“Walk”}}

数组可以有1到5的值。所有这些都取决于用户选择的内容。我想将值插入数据库中。

这是我的代码到目前为止,如果数组计数与我的表列匹配,它可以工作,否则我得到一个错误Insert value list does not match column list我需要任何建议,因为显而易见的原因,在一个准备好的语句中,但我不能想办法。

public function addActivity($eng, $reqid)
   {

    $act = implode("','",array_values($eng[0]));    

    $query  = $this->dbh->prepare("INSERT INTO reqactivity VALUES ('NULL','$reqid','$act')");
            $query->execute();

            var_dump($eng);
   }

这是表结构

  

CREATE TABLE IF NOT NOT EXISTS reqactivity
  id int(12)NOT NULL AUTO_INCREMENT,
  reqid int(12)NOT NULL,
  act1 varchar(15)NOT NULL,
  act2 varchar(15)NOT NULL,
  act3 varchar(15)NOT NULL,
  act4 varchar(15)NOT NULL,
  act5 varchar(15)NOT NULL,
  主要关键(id)   )ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 8;

2 个答案:

答案 0 :(得分:2)

你应该使用参数(命名是可能的,但我只是使用?)作为prepare语句。我假设PDO - http://php.net/manual/en/pdo.prepare.php

$values = array_merge(array('null', $reqid), $eng[0]);
$placers = array_fill(0, count($values), '?');
$query = $this->dbh->prepare("INSERT INTO reqactivity VALUES (".implode(',', $placers.")");
$query->execute($values);

答案 1 :(得分:2)

废弃那张桌子。

如果您有phpMyAdmin,请打开表格,转到操作,然后删除表格。现在改为:

CREATE TABLE IF NOT EXISTS reqactivity (
id int(12) NOT NULL AUTO_INCREMENT,
reqid int(12) NOT NULL,
activities varchar(250) NOT NULL
PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

然后使用它来插入您的活动。它们都将在逗号分隔的一列中。你不能把任何旧数据塞入任何旧列,并希望有足够或不太多。

$query = $this->dbh->prepare("INSERT INTO reqactivity VALUES (NULL, :rid, :act)");
$query->execute(array(":rid"=>$reqid, ":act"=>$act));

不能执行空。请参阅手册中的PDO。

<强> 替代地

如果你想在不改变你的表的情况下完成这项工作,你需要以某种方式确保该数组总是有5个值。不多也不少。如果你能做到这一点,那就按照@aland的方式改变你的查询。