如何使用PHP和PDO将数组插入到单个MySQL Prepared语句中

JM4*_*JM4 16 php mysql pdo loops

在线注册期间,客户可以选择他们选择注册的多个节目.这些程序是三位整数,存储在一个数组中.

例如:

我想加入programid 155,165,175和185.

我的数组设置简单如下:

$data = array();

$data[] = 155;

$data[] = 165;

$data[] = 175;

$data[] = 185;
Run Code Online (Sandbox Code Playgroud)

当需要将此信息插入关联表时,我还会在注册的其他部分中包含其他元素:

例如,如果我正在执行SINGLE程序插入语句,它将如下所示:

$stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()");
$stmt->execute(array($memberid, 155));
Run Code Online (Sandbox Code Playgroud)

我通常会为上面的数组创建一个简单的循环,它将调用sql语句的多个实例并执行如下:

for($j = 0; $j < (count($data)-1); $j++) {
   $stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()");
   $stmt->execute(array($memberid, $data[$j]));
}
Run Code Online (Sandbox Code Playgroud)

我确实意识到上面的代码是无效的($ data [$ j])但是正在寻找正确的方式来进行调用.

我之前也被告知,构建单个动态sql语句总体上比上面的多个调用要好.我的第一次传球将是这样的:

$sql = array(); 
foreach( $data as $row ) {
    $sql[] = '("'.$memberid.'", "'.$row[$j].'", NOW()")';
}
mysql_real_query('INSERT INTO table (memberid, programid) VALUES '.implode(',', $sql));
Run Code Online (Sandbox Code Playgroud)

但是对于PDO,我不太清楚它是如何工作的,特别是对于占位符(?).

有什么建议?

irc*_*ell 29

您可以以编程方式构建查询...:

$sql = 'INSERT INTO table (memberID, programID) VALUES ';
$insertQuery = array();
$insertData = array();
foreach ($data as $row) {
    $insertQuery[] = '(?, ?)';
    $insertData[] = $memberid;
    $insertData[] = $row;
}

if (!empty($insertQuery)) {
    $sql .= implode(', ', $insertQuery);
    $stmt = $db->prepare($sql);
    $stmt->execute($insertData);
}
Run Code Online (Sandbox Code Playgroud)

  • 将它添加到`$ insertQuery`存根:`$ insertQuery [] ='(?,?NOW())';`... (2认同)

Xav*_*osa 9

2解决方案

// multiple queries
$stmt = $pdo->prepare('INSERT INTO table SET memberID=:memberID, programID=:programID, date_added=NOW()');
$data = array(155, 165, 175, 185);
foreach($data as $d) {
    $stmt->execute(array(':memberID' => $memberid, ':programID' => $d));
}
Run Code Online (Sandbox Code Playgroud)

// one query
$data = array(155, 165, 175, 185);
$values = array();
foreach($data as $d) {
    $values[] = sprintf('(%d, %d, NOW())', $d, $memberid);
}
$sql = sprintf('INSERT INTO table (memberID, programID, date_added) VALUES %s', implode (', ', $values));
$pdo->exec($sql);
Run Code Online (Sandbox Code Playgroud)