2017-12-15 4 views
2

나는 이제는 방문자가 ips를 원한다는 이유로 하나의 웹 사이트를 만들었으므로 원격 사용자가 PHP에서 원격 주소를 얻었습니다. 이제는 동일한 사용자가 내 웹 사이트를 방문 할 때보 다 카운터가 더 많을 것입니다. ips 대신에 증가시켜야한다. 그래서 id, ip, date 및 cntr column.But을 사용하여 하나의 테이블 카운터를 만들었습니다. 내 PHP 페이지를 실행하면 내 페이지가 삽입 또는 삭제할 수 있도록 허용하지 않으므로 저를 도와줍니다. 내 코드는 다음과 같습니다.방문자 ips 및 카운터가 업데이트되지 않습니다

<?php 
$username="root"; 
$password=""; 
$servername="localhost"; 
$database="ips"; 
$tableName="ips"; 

error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

$ip = ($_SERVER['REMOTE_ADDR']); 
//echo $ip; 
$con = mysqli_connect($servername,$username,$password,$database); 
if (mysqli_connect_errno($con)) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 
$query2=mysqli_query($con,"select cntr,ip from counter")or die(mysqli_error($con)); 
while($row=mysqli_fetch_array($query2)) 
{ 
    echo $row['ip']; 
    echo $row['cntr']; 

    if($row['ip']== $ip) 
    { 
     mysqli_query($con,"update counter set cntr = cntr+1 where ip = '$ip'"); 
    } 
    else 
    { 
     mysqli_query($con,"insert into counter (ip,date,cntr) values ('$ip',now(),1)"); 
    } 
} 
$_SESSION['status'] = true; 
?> 

답변

0

기본적으로 코드가 작동 할 수 있습니다. 그러나 데이터베이스가 비어 있고 논리 문제가 지적되면주의를 기울여야합니다. 적어도 하나 이상의 데이터 행을 먼저 삽입해야합니다.

다음 코드를보십시오 :

$username="root"; 
$password="7528282"; 
$servername="localhost"; 
$database="stackoverflow"; 
$tableName="ips"; 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 

$ip = ($_SERVER['REMOTE_ADDR']); 
//echo $ip; 

$con = mysqli_connect($servername,$username,$password,$database); 
if (mysqli_connect_errno($con)) 
{ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$query2=mysqli_query($con,"select cntr,ip from counter")or die(mysqli_error($con)); 
//add this to judge whether the database is empty 
if(mysqli_num_rows($query2)){ 
    $found=false; 
    while($row=mysqli_fetch_array($query2)) 
    { 
     echo $row['ip']; 
     echo $row['cntr']; 

     if($row['ip']== $ip) 
     { 
      mysqli_query($con,"update counter set cntr = cntr+1 where ip = '$ip'"); 
      $found=true; 
      break; 
     } 
    } 
    if(!$found){ 
     mysqli_query($con,"insert into counter (ip,date,cntr) values ('$ip',now(),1)"); 
    } 
} 
//if the database is empty, insert one row first 
else{ 
    mysqli_query($con,"insert into counter (ip,date,cntr) values ('$ip',now(),1)"); 
} 
$_SESSION['status'] = true; 
+0

RDev의 의견을 고려하여 답이 업데이트되었습니다. – Phil

1

루프가 논리적으로 올바르지 않습니다 의 당신이 카운터 테이블에 고유 한 IP 100 개 행이 있다고 가정 해 봅시다. 루프에서 99 개의 행을 삽입하고 기존 IP ($ ip)에 해당하는 행 하나만 업데이트합니다. 해당 IP가 없으면 동일한 IP ($ ip)로 100 개의 행을 삽입합니다.

$sql = "select count(*) as cnt from counter where ip = '$ip'"; 
// check if IP is already stored 
$check = mysqli_fetch_array(mysqli_query($con, $sql)); 

그런 다음 삽입 또는 업데이트를 진행 :이 방법

if($check['cnt'] > 0) { 
    // ip is present, update record (your query is fine) 
} else { 
    // ip not present, insert new record (your query is fine) 
} 

확인 할 필요가없는 IP는 다음과 같이, 테이블 카운터에있는 경우

첫째, 내가 확인 할 테이블이 비어있는 경우. 또한 필드 cntr이 NULL로 초기화되지 않았는지 확인하십시오. 그렇지 않으면 +1이 업데이트 쿼리에서 작동하지 않습니다.

관련 문제