Dzień dobry,
przepisuję różne skrypty i strony firmowe z PHP'a 5 na 7 i napotkałem w końcu na problem, z którym nie jestem w stanie się uporać. Od razu chciałbym napomknąć, że żaden ze mnie programista, tylko sieciowiec typu murarz, tynkarz, akrobata :D!
Poniżej wklejam kod, w którym komentarzami jest wyjaśnione co robi. W skrócie pinguje on hosty w sieci i wrzuca aktualne wyniki do bazy danych, z której dane bierze nasze "drzewo sieciowe" pokazując up/down hostów oraz strukturę sieci:
#!/usr/bin/php
<?php
// sprawdza apki i wrzuca do bazy wyniki
//Czytamy konfig
require("/etc/xxx/xxx");
$db = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
//$fping = "fping -r 3 -t 400";
$fping = "/bin/bin/user/fping ";
$sql = "SELECT ip_apka FROM apki_dane WHERE stansieci_ping=\"T\"";
$result = mysqli_query($db, $sql);
while ($rec = mysqli_fetch_array($result))
{
$fping .= " $rec[ip_apka]";
}
$wyjscie = explode(";", shell_exec("$fping 2>/dev/null | tr \"\n\" \";\""));
array_pop($wyjscie);
$sql = "INSERT INTO `stan_sieci` (`ip_apka`, `timestamp`, `stan`) VALUES";
while (list ($key, $line) = each ($wyjscie))
{
$t_line = explode (" ", $line);
// Obcinanie adresu IP do 3 i 4 tego oktetu
// $ip = substr($t_line["0"],8);
$ip = $t_line["0"];
if ($t_line["2"] == "alive") { $alive = "1"; } else { $alive = "0"; }
if ($key > 0) $sql .= ",";
$sql .= " (\"$ip\", now(), \"$alive\")";
}
//na czas wykonywania zapytan , tylko my mozemy je wykonywac
mysqli_query($db, "lock table stan_sieci write");
//$result = mysql_query("DELETE from stan_sieci") or die("err1: Nie mozna wyczyscic danych stanu sieci!");
$result = mysqli_query($db, "TRUNCATE TABLE stan_sieci") or die("err1: Nie mozna wyczyscic danych stanu sieci!");
$result = mysqli_query($db, "INSERT INTO `stan_sieci` (`ip_apka`, `timestamp`, `stan`) VALUES") or die("err2: Nie mozna zapisac danych stanu sieci!");
mysqli_query($db, "unlock tables");
?>
Przed odpaleniem skryptu importuję sobie poprzednie dane do bazy danych, aby wszystko poszło po bożemu. Skrypt wykonuje krok pierwszy bez problemu (czyści dane stanu sieci), ale nie umie poradzić sobie z zapisaniem nowych danych ($result = mysqli_query($db, "INSERT INTO stan_sieci
(ip_apka
, timestamp
, stan
) VALUES") or die("err2: Nie mozna zapisac danych stanu sieci!");).
Nie robiłem żadnych drastycznych zmian w tym skrypcie, bo w większości wymagane były zmiany mysql na mysqli, więc nie wiem co tutaj może iść nie tak, jeżeli na poprzedniej wersji i innej maszynie działa to bezproblemowo. W logach nic nie widzę.
Z góry dziękuję za pomoc :)!