[ask] ON DUPLICATE KEY UPDATE


Status
Not open for further replies.

masiqbal

Hosting Guru
Verified Provider
Maaf Om, apakah penggunannya seperti ini ? karena saya coba dia insert terus
Code:
<?php
function pingAddress($ip) {
$date = date("Y-m-d H:i:s");
include("koneksi.php");

    $pingresult = exec("ping -c3 $ip", $outcome, $status);
    if (0 == $status) {
        mysqli_query($con,"REPLACE INTO coba (ipaddress,status,tglalive) VALUES ('$ip','ALIVE','$date')");
        mysqli_close($con);
    } else {
        mysqli_query($con,"REPLACE INTO coba (ipaddress,status,tgldown) VALUES ('$ip','DOWN','$date')");
        mysqli_close($con);
    }
}

pingAddress("192.168.1.3");
sepertinya begitu, apakah sudah berhasil?
 

xpreborn

Apprentice 1.0
sepertinya begitu, apakah sudah berhasil?
Belum sesuai juga Om, hasilnya dia insert terus setiap dijalankan, ini ss hasilnya : http://postimg.org/image/mceu22zy5/
Saya inginnya jika sudah ada IP yg sama sebelumnya dia ga insert lagi tapi cukup dia update status [jika reply maka statusnya alive dan jika rto maka statusnya down] dan juga tgl/jam nya saja yg diupdate, jika IP beda baru insert

kira2 apa yg kurang yach Om ?
 

masiqbal

Hosting Guru
Verified Provider
Belum sesuai juga Om, hasilnya dia insert terus setiap dijalankan, ini ss hasilnya : http://postimg.org/image/mceu22zy5/
Saya inginnya jika sudah ada IP yg sama sebelumnya dia ga insert lagi tapi cukup dia update status [jika reply maka statusnya alive dan jika rto maka statusnya down] dan juga tgl/jam nya saja yg diupdate, jika IP beda baru insert

kira2 apa yg kurang yach Om ?
Apakah bisa diperlihatkan skema table nya? Mungkin masalah di key
 

xpreborn

Apprentice 1.0
Apakah bisa diperlihatkan skema table nya? Mungkin masalah di key
wah benar Om, sebelumnya saya hanya buat 4 tables saja yaitu ipaddress | status | tglalive | tgldown, skrg perihal ini sudah bisa berjalan ,
Namun ada 2 pertanyaan lagi Om yang belum saya bisa
1. Sekarang yang jalan :
==========================
jika replay dan IPnya blm ada maka akan diinsert ke table coba :
ipaddress = 192.168.1.3
status = ALIVE
tglalive = 2015-10-01 19:34:58
tgldown =
Dan ketika IPnya tidak bisa diping maka akan diupdate tablenya jadi :
ipaddress = 192.168.1.3
status = DOWN
tglalive =
tgldown = 2015-10-01 19:35:02
dan begitu juga sebaliknya
==========================
Nah yang ingin saya tanyakan bagaimana caranya, agar bisa seperti di bawah ini :
==========================
jika replay dan IPnya blm ada maka akan diinsert ke table coba :
ipaddress = 192.168.1.3
status = ALIVE
tglalive = 2015-10-01 19:34:58
tgldown =
Dan ketika IPnya tidak bisa diping maka akan diupdate tablenya jadi :
ipaddress = 192.168.1.3
status = DOWN
tglalive = 2015-10-01 19:34:58
tgldown = 2015-10-01 19:35:02
Dan sebaliknya,ketika bisa diping kembali maka yg diupdate hanya status dan tglalive saja tgldown tetap
==========================

2. Saya ada daftar sekitar 15 IP di satu table namanya yaitu table ipaddress
Jadi, akan diping satu per satu semua IP tersebut dan diinser/diupdate ke table coba hasil statusnya apakah bisa diping atau tidak seperti di atas, namun ketika saya jalankan yang terecord di database hanya ada 2 IP saja yang lainnya tidak ada, kira2 dmn saya salahnya Om
Code:
<?php
function pingAddress($ip) {
$date = date("Y-m-d H:i:s");
include("koneksi.php");

    $pingresult = exec("ping -c1 $ip", $outcome, $status);
    if (0 == $status) {
        mysqli_query($con,"REPLACE INTO monlog (ipaddress,status,tglalive) VALUES ('$ip','ALIVE','$date')");
        mysqli_close($con);
    } else {
        mysqli_query($con,"REPLACE INTO monlog (ipaddress,status,tgldown) VALUES ('$ip','DOWN','$date')");
        mysqli_close($con);
    }
}
include("koneksi.php");
$ipdiping = array();
$query = "SELECT ipaddress from ipaddress";
$result = mysqli_query($con, $query);
while(list($ipaddress) = mysqli_fetch_row($result)) {
pingAddress($ipaddress);
}

Terimakasih banyak sebelumnya Om,
 

xpreborn

Apprentice 1.0
Om @masiqbal
1. Untuk pertanyaan nomor dua sudah fix Om masalahnya hanya karena tidak ada Indexes keyname : ipaddress type : UNIQUE
2. Namun untuk yg pertanyaan nomor satu masih belum bisa juga saya Om, ada saran kira2 Om ?
Yang point ini :

1. Sekarang yang jalan :
==========================
jika replay dan IPnya blm ada maka akan diinsert ke table coba :
ipaddress = 192.168.1.3
status = ALIVE
tglalive = 2015-10-01 19:34:58
tgldown =
Dan ketika IPnya tidak bisa diping maka akan diupdate tablenya jadi :
ipaddress = 192.168.1.3
status = DOWN
tglalive =
tgldown = 2015-10-01 19:35:02
dan begitu juga sebaliknya
==========================
Nah yang ingin saya tanyakan bagaimana caranya, agar bisa seperti di bawah ini :
==========================
jika replay dan IPnya blm ada maka akan diinsert ke table coba :
ipaddress = 192.168.1.3
status = ALIVE
tglalive = 2015-10-01 19:34:58
tgldown =
Dan ketika IPnya tidak bisa diping maka akan diupdate tablenya jadi :
ipaddress = 192.168.1.3
status = DOWN
tglalive = 2015-10-01 19:34:58
tgldown = 2015-10-01 19:35:02
Dan sebaliknya,ketika bisa diping kembali maka yg diupdate hanya status dan tglalive saja tgldown tetap
==========================
 

dpnux

Expert 1.0
Untuk pendekatan dengan menggunakan REPLACE saja tidak mungkin untuk kondisi seperti ini, karena replace sebenarnya adalah INSERT, DELETE, INSERT alias pasti hilang data sebelumnya dan akan ditindih, kalau nilai kolomnya nggak ada akan diisi pada saat REPLACE maka akan menggunakan default yang diset pada saat membuat tabel seperti NULL, 0, dan seterusnya

Mas harus mengambil state terakhir dari ip yang dipanggil kalau datanya sudah ada.
  1. Gunakan SELECT untuk panggil data IP yang sudah ada
  2. Gunakan REPLACE secara lengkap untuk INSERT/UPDATE data
Saya lagi iseng, jadi tak bantuin kode nya hehehe. belum tentu jalan. test aja.

PHP:
<?php

function get_data($con, $ip)
{
   if($result = mysqli_query($con, "SELECT ipaddress,status,tglalive,tgldown FROM monlog WHERE ipaddress = $ip LIMIT 1") && mysqli_num_rows($result > 0)) {
     $data = mysqli_fetch_array($result, MYSQLI_ASSOC);
     mysqli_free_result($result);    
     return $data;
   }
  
   return array(
     'ipaddress' => $ip,
     'status' => '',
     'tglalive' => '',
     'tgldown' => '');
}

function update_data($con, $data)
{
    $replace_data = implode(',', $data); 
    mysqli_query($con, "REPLACE INTO coba (ipaddress,status,tglalive,tgldown) VALUES ($replace_data)");
}

function pingAddress($ip)
{
   include("koneksi.php");
   $date = date("Y-m-d H:i:s");

   $current_data = get_data($con, $ip);
  $pingresult = exec("ping -c1 $ip", $outcome, $status);
    
   if($status == 0)
   {
     $current_data['status'] = 'ALIVE';
     $current_data['tglalive'] = $date;
   }
   else
   {
     $current_data['status'] = 'DOWN';
     $current_data['tgldown'] = $date;
   }
  
   update_data($con, $data);  
   mysqli_close($con);
  
}
 

xpreborn

Apprentice 1.0
Om @dpnux
Terimakasih banyak Om telah melungkan waktunya mencoba dan juga penjelasannya karena sebelumnya juga saya belum tahu yang itu
Baik Om akan saya coba test dulu,
 

xpreborn

Apprentice 1.0
Om @dpnux
Sudah saya coba :
1. Saya coba jalankan script Om di atas ga ada error
2. Kemudian saya coba tambahkan baris berikut di paling bawah dari script Om di atas, yang berfungsi untuk ambil list IP yang akan diping yang terletak ditable daftarip dan baru nanti hasil pingnya (ALIVE atau DOWN) akan disimpan ditable coba

Code:
include("koneksi.php");
$ipaddress = array();
$query = "SELECT ipaddress from daftarip";
$result = mysqli_query($con, $query);
while(list($ipaddress) = mysqli_fetch_row($result)) {
pingAddress($ipaddress);
}
Lalu saya gabung dgn script Om di atas saya letak di baris paling bawah dan ketika saya coba jalankan, saya mendapatkan error sebagai berikut :
Notice: Undefined variable: data in /var/www/html/test.php on line 43
Warning
: implode(): Invalid arguments passed in /var/www/html/test.php on line 20

Saya coba search yang : implode(): Invalid arguments passed
katanya karena $data bukan sebuah array dan di sarankan untuk buat jd $data = array();
Sumber : http://stackoverflow.com/questions/5280180/warning-implode-function-implode-invalid-arguments-passed
Kira2 itu bagaimana yach Om
 

dpnux

Expert 1.0
PHP:
update_data($con, $data);
mysqli_close($con);

variabelnya seharusnya $current_data;

PHP:
update_data($con, $current_data);
mysqli_close($con);

itu masih akan ada error lagi :) didalam fungsi update_data, karena saya pakai implode untuk gambaran saja, pada saat query tidak ada single quotenya.

Mas bisa jabarkan variable yang dibangun di fungsi get_data, agar query REPLACE nya bisa jalan.

Jangan pindahkan kode yang diluar fungsi pingAddress ke dalam fungsi tersebut, karena sudah benar mas codingnya, saya hanya menambahkan fungsi - fungsi saja untuk baca tulis ke mysqlnya

Selamat debug :)
 
Status
Not open for further replies.

Top