2

私がやろうとしていることの完全な要約を得たくない場合は、スキップしてください(問題はここから始まります)

新しいサイトをセットアップしていて、問題が発生しました。

私が基本的にやろうとしているのは、広告を特定の国に割り当てることです。たとえば、英国出身の場合、英国の在庫にある広告が表示されます。

そこで、IP に基づいてユーザーの国を検出する方法について、Google からいくつかのデータを収集しました。これを完全に行う関数を作成しました。

$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変数を内部に配置すると、このクエリが機能しない理由を誰かが理解するのを手伝ってくれますか? こんなに単純なことでこんなに悩んだのは初めてです。

どんな助けでも大歓迎です。

4

5 に答える 5

1

ここで提供される回答のすべてのコードには、SQL インジェクションの脆弱性が含まれています。ユーザー入力をエスケープする必要があります。

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

于 2012-07-27T19:36:00.447 に答える
1

データベースを操作するために PDO ドライバーを使用することで、これを回避しています。これにより、パラメーターを使用できるようになり、SQL ステートメントを簡単に再利用できるようになります。詳細については、この記事をご覧ください。

于 2012-07-27T17:15:31.580 に答える
0

コメントでいくつか質問したところ、$country変数に追加の空白が含まれていることがわかりました。

OPを使用して修正しましたsubstr_replace ($country , '' , -1)。私は個人的に選択しますtrim()

$sql = "SELECT *  FROM `nuevo__htmlad` WHERE `country` = '".trim($country)."' AND `active` = 1 ORDER BY RAND() LIMIT 1";
于 2012-07-27T19:31:01.093 に答える
-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()";
于 2012-07-27T16:36:34.940 に答える
-1

これを試してください:国は文字列なので、私は常にこのスタイルを使用します

$sql= "SELECT *  FROM nuevo__htmlad WHERE country='".$country."' AND active=1 ORDER BY RAND() LIMIT 1";
于 2012-07-27T16:45:58.573 に答える