我有一个标签列表,我想将其存储在我的数据库中。名为"标签"的表有 2 列:id(自动增量)和标签(varchar)。目标是将数组的每个标签附加到"标签"列的唯一行中。我得到的错误是这样的:
警告:PDOStatement::execute(): SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本对应的手册,了解在 '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)值(第 1 行的 'al' 在 C:''xampp''htdocs''cmanager''draft.php 在第 36 行 已成功创建新标记 注意:使用未定义的常量标签 - 在第 34 行的 C:''xampp''htdocs''cmanager''draft.php 中假定的"标签"
代码如下:
<?php
include('../config.php');
$tagList = array('black', 'purple', 'alpha', 'pink', 'normal', 'green', 'shininess', 'specular', 'blue', 'orange',
'nylon', 'stretched', 'brown', 'yellow', 'green', 'suede', 'wood', 'linen', 'red', 'white', 'no', 'tile', 'gray',
'velvet', 'mauve', 'white');
sort($tagList);
print_r($tagList);
try {
$dbh = new PDO("mysql:host=$hostname;dbname=store", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
echo "Connected to database 'r'n";
foreach ($tagList as $k => $v) {
$prep[':' . $k] = $v;
$bind = ':' . implode(',:', array_keys($tagList));
// $sql = 'INSERT INTO tags (tag) ' .
// ' VALUES (:bind)';
$sql = 'INSERT INTO ' . tags . '(' . implode(',', array_keys($tagList)) . ') ' . 'VALUES (' . $bind . ')';
$stmt = $dbh->prepare($sql);
$stmt->execute(array_combine(explode(',', $bind), array_values($tagList)));
echo "New tags created successfully 'r'n";
}
} catch (PDOException $e) {
echo $e->getMessage();
}
我不明白有什么错误。有人可以帮助我吗?谢谢
首先,你有一个语法错误:
'INSERT INTO ' . tags . '('
必须是:
'INSERT INTO tags ('
然后,你有一个奇怪的foreach
,其中理论上你执行 26 个查询,每个$tagList
值一个。从理论上讲,因为一开始循环崩溃。
在第一个循环中,这是发送到数据库的查询:
INSERT INTO tags(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25) VALUES (:0,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25)
如果要在字段中一次插入多个值tag
正确的语法是:
INSERT INTO tags ( tag ) VALUES ( 'tag1' ), ( 'tag2' ), ...
最后但并非最不重要的一点是,您必须执行foreach()
循环来构造查询,然后在循环之外执行查询:
$query = [];
foreach( ... )
{
// Your stuff to set the query here
$query[] = "( :varNameToBind )";
}
$query = "INSERT INTO tags (tag) VALUES " . implode( ", ", $query );
echo $query; // Test your query
die(); // then remove these lines
$stmt = $dbh->prepare( $query );
$stmt->execute( ... );
您的绑定数组构造对我来说似乎很好。