MySQL变量字符串查询仅适用于数字而非文本

时间:2015-05-23 10:54:17

标签: php mysql

我有一个名为Customers的MySQL表,在这个表中我有一个名为Address的VARCHAR类型的字段。

我有一个html表单,要求用户键入一些文本,然后用于搜索地址字段中包含该文本的任何记录。这是代码:

<FORM NAME ="addressform" METHOD ="POST" ACTION ="address.php">
Address:<INPUT TYPE = 'TEXT' Name ='Address'  value="<?PHP print $Address; ?>">
<INPUT TYPE = "Submit" Name = "Submit1"  VALUE = "Search">
</FORM>

这会将用户输入的输入传递给带有变量$ Address

的address.php文件

在address.php文件中,我正在运行此SQL查询:

$SQL = "SELECT * FROM Customers WHERE Address LIKE '%$Address%'";

我想要它做的是返回包含用户输入的字符串的所有记录。

这是我的问题:如果用户只输入数字,它会完美运行,但如果用户输入文字字符则不返回任何内容。

如果有人能给我任何关于它为什么这样做的线索,我将非常感激。

感谢

3 个答案:

答案 0 :(得分:0)

您的代码有两个问题:
1. XSS(HTML注入)
2. SQL注入。

要防止HTML注入,您必须转义您打印的变量。

要防止SQL注入,您必须使用预准备语句(更好的方法)或转义函数。

准备好的陈述如下:

$stmt = $pdo->prepare('SELECT * FROM Customers WHERE Address LIKE ?';
$stmt->execute(['%' . $Address . '%']);
$result = $stmt->fetchAll();

Mysqli也支持准备好的陈述。

如果您使用mysql_query,请使用mysql_real_escape_string函数,但您应该强烈考虑使用PDO

答案 1 :(得分:0)

我设法解决了我的问题。我的问题是我使用quote_smart功能来防止SQL注入攻击。

$Address= quote_smart($Address, $db_handle);

然后将我输入的文本放在',s之间,但如果我只输入数字则不会这样做。

感谢所有提出建议的人。

答案 2 :(得分:-1)

试试这个:    $ SQL =“SELECT * FROM Customers WHERE Address LIKE'%”。$ Address。“%'”;