سوال در رابطه با تکرار نکردن یک کوئری

agahassan

کاربر عضو
سلام میخوام یک کوئری بنویسم که آی پی هارو تو سیستم ثبت کنه ولی نمیخوام آی پی ها که ثبت شده هست را مجدادا ثبت کنه

مثلا این کد :


کد:
INSERT INTO $db_table(ip)VALUES('$test') WHERE ip="'$_SERVER['REMOTE_ADDR']'"
آی پی هایی که قبلا ثبت شده باشه را ثبت میکنه حالا چطوری میشه اینو بر عکس کرد ؟

اصلا شرط عدم مساوی بودن تو کوئری چی هست ؟

 

MahdiY

راهبر انجمن
چند روز پیش در یکی از پروژه هام از این کد استفاده کردم

این کد آی پی ها را در یک رکورد وارد میکنه

مثلا میتونید هر روزی را در یک رکورد وارد کنید

اینم کد :


کد:
<?php
//function
function ip(){
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    return $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    return $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    return $_SERVER['REMOTE_ADDR'];
}
}
//code
$q = mysql_query("select ip From star Where id=$id Limit 1") or die(mysql_error());
$row = mysql_fetch_array($q);
$ip = ip();
$s = splite("|" , $row['ip']);
if (!in_array($ip, $s)) {

    if(empty($row['ip'])){
        $result = mysql_query("UPDATE `star` SET `ip` = '$ip' WHERE `star`.`id` = '$id'") or die(mysql_error());
    }
    else
        $ip = $row['ip'] . "|" . ip();
        $result = mysql_query("UPDATE `star` SET `ip` = '$ip' WHERE `star`.`id` = '$id'") or die(mysql_error());
}
?>
ip : نام فیلد آی پی ها

star : نام جدول

id : کد روز (ترکیب تاریخ!)(تو پروژه من معنیش آی دی کاربر بود)

این کد آی پی را بصورت زیر در تیبیل اینسرت میکنه

127.0.0.1|210.234.53.45|168.192.0.0

کد تست شده هست اما اگه

سوالی بود در خدمتم

 
آخرین ویرایش توسط مدیر:

agahassan

کاربر عضو
سلام ممنون عالی بود ولی مشکل من دقیقا روی :

اصلا شرط عدم مساوی بودن تو کوئری چی هست ؟
هست چون تنها مشکلم این نیست رو موارد دیگه هم به چنین چیزی نیاز دارم

+

اصلا همچین چیزی وجود داره ؟

 

MahdiY

راهبر انجمن
چنین چیزی ممکنه (حداقل میشه با پی اچ پی این کار رو کرد)

البته شرط را باید در داخل پرانتز بذاری

مثلا

( s > 0 )

و برا نامساوی (باید تست کنید)

( s <> 0 )

امیدوارم درست راهنمایی کرده باشم و بکارتون بیاد

 

william

کاربر عضو
می تونید attribute فیلد ip رو روی Unique قرار بدید. بنابراین با یکتا در نظر گرفتن فیلد ip در صورت افزودن مقداری که از پیش وجود داشته باشه میتونید عملیات دلخواه خودتون رو انجام بدید.

مثلا INSERT در صورت عدم وجود و در غیر این صورت UPDATE:


کد:
INSERT INTO table_name (c1, c2, c3) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE col = VALUES(col)
از NOT EXISTS هم میتونید استفاده کنید.

روش دیگه، اینه که ابتدا یک کوئری SELECT با کاندیشن های مورد نظر اجرا کنید، در صورتی که تعداد ردیف ها مقدار 0 رو برگردوند، سپس اقدام به اجرای کوئری INSERT کنید. البته این روش اصلا توصیه نمیشه!

استفاده از if و else هم در کوئری توصیه نمیشه. باعث کاهش کارای و سرعت میشه...

 
آخرین ویرایش توسط مدیر:

agahassan

کاربر عضو
پی اچ پی بلدم یعنی کلاس رفتم یاد گرفتم برا مساوی :


کد:
if($s==$t)
برای نا مساوی :


کد:
if($s!=$t)
می تونید attribute فیلد ip رو روی Unique قرار بدید. بنابراین با یکتا در نظر گرفتن فیلد ip در صورت افزودن مقداری که از پیش وجود داشته باشه میتونید عملیات دلخواه خودتون رو انجام بدید.
مثلا INSERT در صورت عدم وجود و در غیر این صورت UPDATE:
کد:
INSERT INTO table_name (c1, c2, c3) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE col = VALUES(col)
از NOT EXISTS هم میتونید استفاده کنید.
روش دیگه، اینه که ابتدا یک کوئری SELECT با کاندیشن های مورد نظر اجرا کنید، در صورتی که تعداد ردیف ها مقدار 0 رو برگردوند، سپس اقدام به اجرای کوئری INSERT کنید. البته این روش اصلا توصیه نمیشه!
استفاده از if و else هم در کوئری توصیه نمیشه. باعث کاهش کارای و سرعت میشه...
سپاس :53:
 

agahassan

کاربر عضو
تصویر ضمیمه را نگاه کنید . مقداری که فرمودید را نداره



 

william

کاربر عضو
از تب Structure

قسمتی که هایلایت کردم...

mysqlJPG_42630138021375820244.jpg


 

agahassan

کاربر عضو
آقا ممنون که پیگیر هستی :53:

این کد را نوشتم :


کد:
   mysql_connect("$db_host", "$db_user", "$db_pass")or die("error db");
          mysql_select_db("$db_name")or die("error t");
          $test=$_SERVER['REMOTE_ADDR'];
          $sql="INSERT INTO $db_table(ip)VALUES('$test') ON DUPLICATE KEY UPDATE viwer SET ip='$test' WHERE ip='$test'";
           $result=mysql_query($sql);
           if($result){
                   echo "ok";
              }else{
                   echo "ERROR";
           }
    mysql_close();
فقط ارور نشون میده ولی وقتی :


کد:
ON DUPLICATE KEY UPDATE viwer SET ip='$test' WHERE ip='$test'
پاک میکنی درست نشون میده . کجاش اشتباه هست ؟ :30:

 

william

کاربر عضو
تغییر بدید به:


کد:
$sql="INSERT INTO $db_table (ip) VALUES('".mysql_real_escape_string($test)."') ON DUPLICATE KEY UPDATE ip = ip";
درسته که داریم آی پی رو در دیتابیس قرار میدیم. اما چون مقدار خارجی داریم وارد برنامه میکنیم، بهتره چک بشه تا یه وقت به SQL Injection دچار نشیم.

اگر هم میخواید خطای رخ داده رو متوجه بشید میتونید خط


کد:
echo "ERROR";
رو تغییر بدید به


کد:
echo "ERROR: ".mysql_error();
 
بالا