1

我正在尝试编写 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。

4

2 回答 2

4

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.'')"')
于 2012-12-17T14:12:11.390 回答
1

深入了解确切的 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();
于 2012-12-17T14:24:50.373 回答