2

这是我在这里的第一个问题,我希望它足够简单,可以快速得到答案!

基本上,我有以下代码:

$variable = curPageURL();
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable' ;

如果我回显 $ 变量,它会打印当前页面的 url(这是我页面上的 javascript)

最终,我想要的是能够进行搜索,搜索词是当前页面的 url,前后使用通配符。我不确定这是否可能,或者我只是有语法错误,因为我没有收到任何错误,根本没有结果!

我试过 :

    $query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '"echo $variable" ' ;

但同样,我可能会丢失或使用错位的 '" ; 等等。

请告诉我我做错了什么!

4

6 回答 6

24

最终,我想要的是能够进行搜索,搜索词是当前页面的 url,前后使用通配符。

SQL 通配符是百分号。所以:

$variable = curPageURL();
$variable = mysql_real_escape_string($variable);
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '%{$variable}%'";

注意:我添加了一些额外的代码。mysql_real_escape_string()将保护您免受用户故意或意外放置会破坏您的 SQL 语句的字符。您最好使用参数化查询,但这比这个简单的修复更复杂。

另请注意:我也修复了您的字符串引用。如果字符串被双引号括起来,并且您在$query.

2015 年 1 月 17 日编辑:刚刚获得了赞成票,因此请记住这一点,不要再使用这些mysql_*功能。

于 2009-12-03T23:02:58.673 回答
7

采用:

$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '{$variable}'" ;

为了了解为什么要防止 SQL 注入攻击,就像上面那样容易受到攻击,我提交了“妈妈的利用”:

替代文字

于 2009-12-03T22:58:50.537 回答
5

请不要这样做,它很容易受到SQL 注入的影响(这是您在返回应用程序之前应该阅读、吸收和理解的 138 个 StackOverflow 问题的列表)。使用参数化查询或存储过程。

于 2009-12-03T22:58:21.247 回答
2

如果需要替换变量值,请使用双引号:

## this code is open for SQL injection attacks
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable'";

或手动连接字符串:

## this code is open for SQL injection attacks
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE "' . $variable . '"';
于 2009-12-03T23:05:27.970 回答
1

您的代码容易受到 SQL 注入攻击。用户提供的数据绝不应直接放入 SQL 查询字符串中。相反,它必须首先使用诸如mysql_real_escape_string().

于 2009-12-03T23:36:29.623 回答
0

至于为什么没有通知您语法错误:您的错误报告设置很可能没有正确设置。

打开php.ini并确保设置了以下内容:

display_errors = On

和:

error_reporting = E_ALL
于 2009-12-03T23:19:03.437 回答