2012-07-27 83 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