2017-07-09 5 views
0

私たちのランディングページにヒットしたときに、データベース内の既知または未知のIPアドレスに対して正確なFLAGを与えるSQLクエリを作成しようとしています。私はこれを使用しますランディングページからIPを引き出し、既知のユーザーと比較する

// get the IP of the user on this landing page 
$ip_address=$_SERVER['REMOTE_ADDR']; 
echo $ip_address. ' ip address<br/>'; 

// see if we know this user.. 
$search_first="SELECT COUNT(DISTINCT(ip_address)) FROM `qb_sessions` WHERE `ip_address` = '$ip_address' "; 
$has_ips = mysql_query($search_first); 
$has_ip = mysql_num_rows($has_ips); 
echo $has_ip. ' has IP<br/>'; // should show count in table 

このスニペットを使用して私が必要とする結果は得られません。テーブルが空の場合(このIPには一致しません)、$ has_ipのエコーとして '1'が得られます。このIPがqb_sessions表に以前に記録されていれば、本当に一致するものがない場合は「0」が必要で、「& gt 1」の場合は必要です。このスニペットの目的は、

は私がの様々な組み合わせを試してみましたなど、このランディングページに新しい、非登録のヒットを識別し、後でニュースレターに参加するように、別のページにリダイレクトするために、割引クーポンを取得することです( ')$ ip_address引用符をエスケープすることを含め、無駄にするSQL。

ご協力いただきありがとうございます。

+0

、あなたは強く 'mysqli'または' PDO'機能への切り替えを検討する必要があります。http://php.net/manual/en/function.mysql-query.php( 'mysql_query'はされています非推奨です)。 – Optimae

+0

皆さん、ありがとうございました!! ..はい、COUNT()はそれを投げていました。私はここを見直す前に考え出しました...(@Rajdeep Paul sidenoteに関して:...私は認識していますが、このサイトには現在何があるのですか...開発サーバーでは移行が進行中ですが、このアイテムは上司**に従ってすぐに生きていく必要があります。)_ –

+0

@SteveK Please green * *受け入れ*質問を閉じるために答え、そうでなければこの質問は*オープン*質問としてSOの周りに浮かんでいます。 –

答えて

3

...テーブルが空の場合(このIPと一致しない場合)、私はまだ$has_ipのエコーとして '1'を取得します。

これは、MySQLのCOUNT()機能のためです。テーブルに1行またはn行が含まれているかどうかは、という正確に1行のを返します。これは、SELECTクエリから返された行の数を示します。

PHPのmysql_num_rows()関数を使用しているため、行数をカウントするため、SELECTクエリからCOUNT()を削除してください。

$search_first="SELECT DISTINCT(ip_address) FROM `qb_sessions` ... 

追記:mysql_*機能を使用しないでください、彼らは、PHP 5.5で廃止されており、PHP 7.0で完全に削除されます。代わりにmysqliまたはpdoを使用してください。 And this is why you shouldn't use mysql_* functions

3
SELECT COUNT(DISTINCT(ip_address)) 

これは、常にが行を返すために起こっています。正確に1つの行。正確に1つの数字が含まれています。その数字はゼロかもしれませんが、その数字を含む結果の行があります。

mysql_num_rows($has_ips) 

上記のクエリは常に1行を返すため、これは常に1です。

返された行を数える代わりに、すでに数えられた戻り値を調べます。このような何か:)私はPHPのコードを書いているので、結果はフェッチする方法です

$has_ips = mysql_query($search_first); 
$row = mysql_fetch_array($has_ips); 
$has_ip = $row[0]; 
echo $has_ip. ' has IP<br/>'; 

は(私が思う、それはしばらくしている。しかしアイデアは、あなたが最初の(唯一の希望、十分に簡単です。返された最初の(唯一の)行の要素)

0

PDOでパラメータをバインドする必要があります。

これは別の方法です。ここでは、結果が返されたかどうかを確認するだけです。ところで

$stmt = $conn->prepare("SELECT * FROM qb_sessions WHERE ip_address=:ip_address"); 
$stmt->bindParam(':ip_address', $ip_address); 
$ip_address = "73.85.207.17"; // example ip 
$stmt->execute(); 
$result = $stmt->fetchAll(); 
echo (count($result) > 0) ? 'IP found' : 'IP NOT found'; 
関連する問題