2009-12-03 143 views
1

这是我的第一个问题,我希望它很简单,以得到一个快速的答案!

基本上,我有以下代码:

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

如果我回声$变量,它打印当前页面的URL(这是我的网页上一个javascript)

归根结底,我想,能够搜索哪个搜索项是当前页面的URL,前后都带有通配符。我不确定这是否可能,或者如果我只是有一个语法错误,因为我没有错误,根本没有结果!

我想:

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

但同样,我可能丢失或使用放错地方的'“;等等

请告诉我,我在做什么错

+0

这是什么语言?字符串引用看起来有点奇怪。 – 2009-12-03 23:01:31

+0

@Joe:代码是PHP。 – 2009-12-03 23:02:37

+0

你会在http://stackoverflow.com/questions/1318028/php-different-quotes找到解决方案 – 2009-12-03 23:09:58

回答

20

Ultimately, what I want, is to be able to make a search for which the search-term is the current page's url, with wildcards before and after.

的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_*功能了。

+0

谢谢!你是救世主,非常感谢你!我只是注意到你的编辑,这是我没有做的!现在它工作正常,非常感谢,并且这个网站是definitly favourited。 – skarama 2009-12-03 23:16:07

+1

+1:我欣赏关于downvote的评论。 – 2009-12-03 23:24:30

+0

这对我很有用。谢谢:) – sg552 2012-02-23 16:00:00

6

使用:

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

要明白为什么以防止SQL注入攻击,就像上面将是脆弱的一个想法,我提出“一个妈妈的漏洞”:

alt text

+0

我明白了,但是,表名和列名不是实际的字段名,我改变了真正的字段名。或者我错了?而且我没有冒犯,我很高兴我得到很多快速答案! – skarama 2009-12-03 23:04:27

+0

skarama:他意味着你不应该使用字符串输入参数来创建SQL查询。通过这样做,您可以让用户完全访问数据库(具有与Web服务器相同的权限)。 – 2009-12-03 23:08:57

+0

@Skarma:SQL注入攻击的关键在于它人为地终止了你试图填充的字符串参数,然后立即提交第二个查询,可能是恶意的。在第一个查询中发生什么并不重要。 – 2009-12-03 23:10:14

1

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

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

或者CONCAT手动字符串:

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

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

打开php.ini,并确保以下设置:

display_errors = On 

和:

error_reporting = E_ALL 
1

您的代码很容易受到SQL注入式攻击。用户提供的数据决不能直接放入SQL查询字符串中。相反,它必须首先通过诸如mysql_real_escape_string()之类的功能进行消毒。