输入 MySql 时嵌套引号
Nested quotes when inputting into MySql
我在将数据插入 MySql
table 时遇到问题。为简单起见,我的数据库有 2 tables,foo & foo2.
Table foo2 有两条记录
id=1, code="N", desc="Normal"
id=2, code="D", desc="Deviate"
我想填充 foo 但我需要在这样做时引用 foo2。我当前的代码是:
$inputarray = array(
array("ONE", "Proj 1", "N"),
array("TWO", "Proj 2", "D"));
for ($i = 0; $i < count($inputarray); $i++) {
$sql3 = $pdo->prepare("INSERT INTO foo (var1, var2, var3)
VALUES ('{$inputarray[$i][0]}'
,'{$inputarray[$i][1]}'
, (select id from foo2 where code='($inputarray[$i][3])')
)");
$sql3->execute();}`
"select id .." 行生成一条 SQL 错误消息,但如果我硬编码它,如
(select id from foo2 where code='N')
然后程序运行没有错误。我试过转义字符,在单引号内使用双引号等。我怎样才能最好地解决这个问题?
创建 foo 的代码是
$sql2 = $pdo->prepare('
CREATE TABLE foo(
id INT NOT NULL AUTO_INCREMENT,
var1 VARCHAR(3) NOT NULL UNIQUE,
var2 VARCHAR(32) NOT NULL,
var3 INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (var3) REFERENCES foo2 (id)
ON DELETE RESTRICT
ON UPDATE RESTRICT) ENGINE=INNODB');
这不是使用准备语句的方式
$pdo->prepare("INSERT INTO foo (var1, var2, var3)
VALUES ('{$inputarray[$i][0]}'
,'{$inputarray[$i][1]}'
, (select id from foo2 where code='($inputarray[$i][3])')
)");
这是普通的旧字符串连接,出于所有实际目的,您不妨在此处使用 mysql_*
函数。 PDO的正确使用方法是这样的:
$pdo->prepare("INSERT INTO foo (var1, var2, var3)
VALUES (?,?, (select id from foo2 where code=?))");
$pdo->bindParam(1, $inputarray[$i][0])
$pdo->bindParam(2, $inputarray[$i][1])
$pdo->bindParam(3, $inputarray[$i][3])
请注意您的代码的可读性提高了多少?您可以避免重复调用 bindParam by directly passing in the parameters to execute.
ps:为了使您当前的代码正常工作{$inputarray[$i][3]}
请注意新添加的大括号
我在将数据插入 MySql
table 时遇到问题。为简单起见,我的数据库有 2 tables,foo & foo2.
Table foo2 有两条记录
id=1, code="N", desc="Normal"
id=2, code="D", desc="Deviate"
我想填充 foo 但我需要在这样做时引用 foo2。我当前的代码是:
$inputarray = array(
array("ONE", "Proj 1", "N"),
array("TWO", "Proj 2", "D"));
for ($i = 0; $i < count($inputarray); $i++) {
$sql3 = $pdo->prepare("INSERT INTO foo (var1, var2, var3)
VALUES ('{$inputarray[$i][0]}'
,'{$inputarray[$i][1]}'
, (select id from foo2 where code='($inputarray[$i][3])')
)");
$sql3->execute();}`
"select id .." 行生成一条 SQL 错误消息,但如果我硬编码它,如
(select id from foo2 where code='N')
然后程序运行没有错误。我试过转义字符,在单引号内使用双引号等。我怎样才能最好地解决这个问题?
创建 foo 的代码是
$sql2 = $pdo->prepare('
CREATE TABLE foo(
id INT NOT NULL AUTO_INCREMENT,
var1 VARCHAR(3) NOT NULL UNIQUE,
var2 VARCHAR(32) NOT NULL,
var3 INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (var3) REFERENCES foo2 (id)
ON DELETE RESTRICT
ON UPDATE RESTRICT) ENGINE=INNODB');
这不是使用准备语句的方式
$pdo->prepare("INSERT INTO foo (var1, var2, var3)
VALUES ('{$inputarray[$i][0]}'
,'{$inputarray[$i][1]}'
, (select id from foo2 where code='($inputarray[$i][3])')
)");
这是普通的旧字符串连接,出于所有实际目的,您不妨在此处使用 mysql_*
函数。 PDO的正确使用方法是这样的:
$pdo->prepare("INSERT INTO foo (var1, var2, var3)
VALUES (?,?, (select id from foo2 where code=?))");
$pdo->bindParam(1, $inputarray[$i][0])
$pdo->bindParam(2, $inputarray[$i][1])
$pdo->bindParam(3, $inputarray[$i][3])
请注意您的代码的可读性提高了多少?您可以避免重复调用 bindParam by directly passing in the parameters to execute.
ps:为了使您当前的代码正常工作{$inputarray[$i][3]}
请注意新添加的大括号