【问题标题】:Nested quotes when inputting into MySql输入 MySql 时的嵌套引号
【发布时间】:2016-09-09 05:17:26
【问题描述】:

我在将数据插入MySql 表时遇到问题。为简单起见,我的数据库有 2 个表,foo 和 foo2。

表 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');

【问题讨论】:

    标签: mysql insert quotes


    【解决方案1】:

    这不是使用准备好的语句的方式

    $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])
    

    注意您的代码的可读性提高了多少?您可以通过直接将参数传递给execute 来避免对bindParam 的重复调用。

    ps:要使您当前的代码正常工作{$inputarray[$i][3]},请注意新添加的大括号

    【讨论】:

    • 非常感谢@e4c5 的回答
    • 很高兴能帮上忙
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2012-04-08
    • 2010-11-30
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多