【问题标题】:Insert SQL code into database in PHP/MySQL在 PHP/MySQL 中将 SQL 代码插入数据库
【发布时间】:2012-12-17 14:09:37
【问题描述】:

我正在尝试编写 sql 以将 SQL 代码插入到表的列中。 该表有这三列:email、验证码、sql。

我尝试了这段代码,以及它的变体,玩弄引号和反斜杠/转义它们等等......但还是有问题:

INSERT INTO pre_registration(email, verification_code, sql) VALUES('myemail@gmail.com', '8efb100a295c0c690931222ff4467bb8', '"INSERT INTO customer(title) VALUES(\'Mr.\')"')

它告诉我 SQL 语法有错误:

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sql) VALUES('myemail@gmail.com', '89f0fd5c927d466d6ec9a21b9ac34ffa', "INSER' at line 1

怎么做?我正在使用 PHP/MySQL。

【问题讨论】:

  • 它报告的具体错误是什么?在什么 RDBMS 上?它实际上看起来对大多数人来说都可以正常工作......
  • 我已编辑问题以包含错误。我正在使用 php/MySQL。
  • SQL 是 MySQL reserved keyword 您必须用反引号将其引用为列名。

标签: mysql sql insert escaping


【解决方案1】:

MySQL 将sql 视为关键字。你必须引用它:

INSERT INTO pre_registration(email, verification_code, `sql`) VALUES('myemail@gmail.com', '8efb100a295c0c690931222ff4467bb8', '"INSERT INTO customer(title) VALUES(\'Mr.\')"')

顺便说一句,双引号来转义它们,而不是使用 bakslashes。这对 SQL 更友好。

INSERT INTO pre_registration(email, verification_code, `sql`) VALUES('myemail@gmail.com', '8efb100a295c0c690931222ff4467bb8', '"INSERT INTO customer(title) VALUES(''Mr.'')"')

【讨论】:

  • 在 MySQL 中,引号可以被反斜杠转义
  • @MichaelBerkowski 好的,我已经重新标记了这个问题。
【解决方案2】:

深入了解确切的 SQL 错误会有所帮助。乍一看,我会说您需要在表名和左括号之间以及值和左括号之间应用空格。

此外,SQL 部分的双引号周围的单引号可能会产生错误,尽管我不确定。单引号之间的任何内容都按字面意思解释,这应该使转义字符实际上是存储数据中的斜线。

另外,sql 是保留字,必须加引号才能使用。

最后,根据您的情况,使用准备和绑定参数可能会有更安全的数据输入方法:

try
{
    $conn = new PDO ( "sqlsrv:server = $serverstringname; Database = $logindatabase", "$loginusername", "$loginpassword");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

catch ( PDOException $e )
{
    print( "Error connecting to SQL Server." );
    die(print_r($e));
}

$email = 'myemail@gmail.com' //or some other way of setting the variable like $_POST
$verification_code = '#####' //or $_Post method
$sql = 'Put Query Here' //probably have to declare this explicitly

$sql_insert = "INSERT INTO pre_registration_info (email, verification_code, 'sql') VALUES (?,?,?)";
        $stmt = $conn->prepare($sql_insert);
        $stmt->bindValue(1, $email);
        $stmt->bindValue(2, $verification_code);
        $stmt->bindValue(3, $sql);
        $stmt->execute();

【讨论】:

  • 'sql' 应该用反引号而不是引号包围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2013-09-15
  • 2019-05-27
  • 2011-05-03
  • 2015-01-02
相关资源
最近更新 更多