我需要将特定值插入到我正在使用 SQL 处理的表中(请参见下面的函数):
INSERT INTO *Table Name* (...) VALUES(...);
将要存储在此表中的值是涉及另一种编程语言的值,这些编程语言有很多奇怪的符号,包括单个反斜杠、*、美元符号等。
我怎样才能准确地插入值,因为它们在这个表中?
例如,当我键入“\2”时,它需要在表中返回 \2 而不仅仅是 2。我无法手动输入两个反斜杠来获取 \2。这是因为我通过 HTML 接收来自另一个用户的输入并使用 PHP 将其发送到我的表。我遇到的问题是正在输入的带有 SQL 的这些特殊字符并不是我打算将它们作为值的方式。
有没有办法用预先调用的某个字符串函数准确地输入这些值?其他方法将不胜感激!
数据库的附加信息:
服务器:通过 UNIX 套接字的 localhost
服务器类型:MySQL
服务器连接:未使用 SSL 文档
服务器版本:5.6.49-cll-lve - MySQL 社区服务器 (GPL)
潜在答案: $mysqli 是否定义如下?(我称之为 $db。)
$mysqli=mysqli_connect(...);
因此,该文字添加如下:
$query = "INSERT INTO Table (C1, ... Cn) VALUES('$C1', ... '$Cn')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $C1, ..., $Cn);
$stmt->execute();
mysqli_query($db, $query);
只是不要使用字符串插值或连接将值获取到 PHP 中的 SQL 查询中。这很容易出错,并且可能使您的程序容易受到 SQL 注入攻击。
使用参数化查询。请参阅“如何在 MySQL 语句中包含 PHP 变量”和“如何防止 PHP 中的 SQL 注入?” .
使用参数化查询还将确保数据以必要的方式自动转义。所以这也解决了你的问题。无需手动转义。
您正在寻找一种输入字符串常量的方法。
假设我们要输入“
\X*$Y$!'Z,"
”;然后,
根据 SQL 标准,
'\\X*$Y$!''Z,"'
\
- 逃脱了\
'
- 逃脱了'
Oracle 特定:取决于列数据类型;见https://stackoverflow.com/a/1192431/13950739
SQL Server 特定:需要
N
前缀;见https://stackoverflow.com/a/31270557/13950739和https://stackoverflow.com/a/6380696/13950739使用 PostgreSQL 的“C 风格转义”语法,
E'\\X*$Y$!\'Z,"'
E
,所以开始分隔符是E'
; 结束分隔符只是'
.\
- 逃脱了\
\
- 逃脱了'
使用 PostgreSQL 的“Unicode 转义”语法,
U&'\005CX*$Y$!\0027Z,"'
U&
,所以开始分隔符是U&'
; 结束分隔符只是'
.\
,以十六进制表示'
,以十六进制表示使用 PostgreSQL 的“美元报价”语法,
$flarp$\X*$Y$!'Z,"$flarp$
$
加上任意字符的可选序列(我用过flarp
,你可以用任何你喜欢的)加$
;结束分隔符是一样的。$whateverSpecialDelimiterTagYouChose$
,也就是说!我相信你只需要在每个特殊字符后面插入一个反斜杠来转义它。反斜杠在 MySQL 中被保留为特殊的转义字符(甚至转义其他反斜杠),以便将前面的字符视为文字。您可以在MySQL Docs中阅读更多相关信息。
如果您使用的是 PHP,则取决于版本,您还可以在应用程序端利用这些函数之一来转义特殊字符。