2012-07-27 81 views
2

如果你不想得到什么,我试图做跳到(问题从这里开始)配售PHP变量到MySQL查询

我设置了我的新网站,并碰上了一个完整的总结一个问题。

我基本上试图做的是将广告分配到特定的国家。举例来说,如果您来自英国,您会看到我们在英国库存中的广告。

因此,我从Google收集了一些关于如何基于IP检测用户所在国家的数据。 我已经做了一个完美的功能。

$ip_address= $_SERVER['REMOTE_ADDR']; 

function ip_location($ip){ 
    $parts = explode('.', $ip); 
    $numeric_ip = $parts[3] + (256 * $parts[2]) + (256 * 256 * $parts[1]) + (256 * 256 * 256 * $parts[0]); 

    $sql = "SELECT country FROM iptocountry WHERE lower_bound <= $numeric_ip AND upper_bound >= $numeric_ip LIMIT 1"; 
    $result = mysql_query($sql); 
    $country = mysql_result($result, 0); 
    return $country; 
} 

$country = ip_location($ip_address); 
echo $country; // Always echos the correct country 

(问题从这里开始)

所以此功能工作正常。创建此函数后,我创建了一个MYSQL查询,它使用该函数中的数据选择一个广告来显示用户。

这是问题出现的地方。

当我键入此查询:

$sql = "SELECT * FROM `nuevo__htmlad` WHERE `country` = 'united kingdom' AND `active` = 1 ORDER BY RAND() LIMIT 1"; 

使用country = 'united kingdom'它工作正常,但是当我把country = '$country'

没有什么工作是永远不会显示广告。

任何人都可以帮助我理解,为什么这个查询不起作用,当我把它的PHP变量。这实际上是第一次这么简单,让我感到非常困扰。

任何帮助,将不胜感激。

+0

首先打印您的查询'echo $ sql;'并向我们显示结果。 – Tchoupi 2012-07-27 16:28:59

+0

@MathieuImbert说了什么,但要澄清,告诉我们'echo $ sql'在硬编码国家和变量使用中都显示了什么。 – Ally 2012-07-27 16:31:59

+0

您可以简单地执行INSERT .... VALUES(INET_ATON('$ ip'))'并保存自己的PHP端数学。这在某些时候会炸毁32位php安装。 – 2012-07-27 16:32:56

回答

0

在评论中询问了几个问题后,结果发现$country变量包含了额外的空白空间。

OP使用substr_replace ($country , '' , -1)固定它。我本人来说选择trim()

​​
+0

不可以。您无需[正确的SQL转义]就可以获得一个例子(http://bobby-tables.com/php.html)。 – tadman 2012-07-27 20:41:58

+0

哦!你好鲍比桌子的爸爸! – Tchoupi 2012-07-27 23:07:01

-1
$sql= "SELECT * FROM nuevo__htmlad WHERE country='$country' AND active=1 ORDER BY RAND() LIMIT 1"; 

或该试试这个也

$sql= "SELECT * FROM nuevo__htmlad WHERE country='$country' AND active=1 LIMIT 1 ORDER BY RAND()"; 
+0

如果没有[正确的SQL转义](http://bobby-tables.com/php.html),你就会赢得一个例子。 – tadman 2012-07-27 20:39:59

+0

合适。我刚才提供了一个具体问题的具体答案。 – 2012-07-27 20:44:39

+0

虽然这在技术上是正确的,但像这样的答案会促使极度危险的习惯。 – tadman 2012-07-27 21:08:50

-1

试试这个: 我一直以来的国家是一个字符串中使用这种风格

$sql= "SELECT * FROM nuevo__htmlad WHERE country='".$country."' AND active=1 ORDER BY RAND() LIMIT 1"; 
+0

错了。如果没有[适当的SQL转义],你就会赢得一个例子(http://bobby-tables.com/php.html)。 – tadman 2012-07-27 20:41:26

1

我避免这种用PDO驱动程序用于处理数据库。这使我可以使用参数并使重复使用sql语句变得容易。查看this article了解更多信息。

+0

这是正确的答案。 – tadman 2012-07-27 20:40:50

1

所有在这里提供的答案代码包含SQL注入漏洞。你必须逃避用户输入。

http://en.wikipedia.org/wiki/SQL_injection

+0

[Bobby Tables](http://bobby-tables.com/php.html)网站有很好的介绍。 – tadman 2012-07-27 20:39:08