preg_match fehler
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
auftritt
ausgetauscht ergebnis
besagten zeilen
code
date
datei
datum
denkfehler
ersten code
fehler
hundert
machen
problem
sagen
set
sinn
studieren
voll vergessen
zeile
zweite code
-
In meinem Backup Script soll nach gewissen Abständen eine neuer Insertblock entstehen.
Das klappt eigentlich, nur ab der Zeile 992 (bis Zeile 1009) nicht.
Dort werden zu Anfang statt , plötzlich ; gesetzt und danach nach jeder Datenzeile ein neues Insert.
Ich kann den Fehler einfach nicht finden, kann mir jemand sagen woran es liegt das der Fehler dort kommt?
$db = new mysqli($db_host, $db_user, $db_pw, $db_name); $table_contents = $db->query('SELECT '.$select.' FROM `'.$table.'`'); if($table_contents->num_rows != 0) { $table_columns = $db->query('SHOW COLUMNS FROM `'.$table.'`'); $columns = ''; $columns_num = 0; $columns_max = $table_columns->num_rows; while($this_columns = $table_columns->fetch_assoc()) { $columns .= ($columns_num == ($columns_max-1)) ? '`'.$this_columns['Field'].'`' : '`'.$this_columns['Field'].'`, '; $field[$columns_num] = $this_columns['Field']; ++$columns_num; } $datei .= 'INSERT INTO `'.$table.'` ('.$columns.') VALUES '; $contents_max = $table_contents->num_rows; $c = 0; $s = 1; $quero = ''; while($this_contents = $table_contents->fetch_assoc()) { if(preg_match("/([1-9]00|[1-9]000|[1-9]0000|[1-9]00000)/", $c)) { $datei .= ' INSERT INTO `'.$table.'` ('.$columns.') VALUES '; } $datei .= '('; $f = 0; while($f <= $columns_max-1) { if(ctype_digit($this_contents[$field[$f]])) { if($f == 0) { $datei .= $s.', '; $quero .= ' UPDATE `phpbb_privmsgs_to` SET `msg_id` = '.$s.' WHERE `msg_id` = '.$this_contents[$field[$f]].';'; ++$s; } else { $datei .= ($f == ($columns_max-1)) ? $this_contents[$field[$f]] : $this_contents[$field[$f]].", "; } } else { $this_contents[$field[$f]] = str_replace("'", "''", $this_contents[$field[$f]]); $this_contents[$field[$f]] = preg_replace("#\r\n#", "\\r\\n", $this_contents[$field[$f]]); $this_contents[$field[$f]] = preg_replace("#\n#", "\\n", $this_contents[$field[$f]]); $datei .= ($f == ($columns_max-1)) ? "'".$db->escape_string($this_contents[$field[$f]])."'" : "'".$db->escape_string($this_contents[$field[$f]])."', "; } ++$f; } $datei .= (preg_match("/(".($contents_max-1)."|99|[1-9]99|[1-9]999|[1-9]9999|[1-9]99999)/", $c)) ? '); ': '), '; ++$c; }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ohne deinen Code jetzt großartig zu studieren, fiel mir etwas auf: Das zweite Anhängsel an $datei (geht ja gleich mit Anhängseln los) kann nicht angehängt werden, wenn das erste nicht angehängt wurde. Der Variableninhalt
macht aber keinen Sinn.INSERT INTO `'.$table.'` ('.$columns.') VALUES INSERT INTO `'.$table.'` ('.$columns.') VALUES
-
Das zweite
ist in dem IF in dem das Problem auftritt. Jedoch wird es nur angehängt wenn die IF Abfrage Positiv ist (100, 200, 300 ... 900, 1000, 200...) Nur finde ich keine Erklärung warum es bei den besagten Zeilen nicht funktioniert. Vor dem erstenINSERT INTO `'.$table.'` ('.$columns.') VALUES
kommt noch einINSERT INTO `'.$table.'` ('.$columns.') VALUES
$datei = '-- -- Amity Datenbank Backup -- Erstellungsdatum: '.date("D d.m.Y H:i:s").' -- SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */;';
Ich habe mir gerade mal alle Werte von $c ausgeben lassen die mit dem preg_match gefunden wurden.
100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1100, 1200, 1300, 1400
Obwohl sich nichts an den Daten und dem Code geändert hat hat sich das ganze verschoben.if(preg_match("/([1-9]00|[1-9]000|[1-9]0000|[1-9]00000)/", $c)) { $datei .= ' INSERT INTO `'.$table.'` ('.$columns.') VALUES '; echo $c; }
Ich habe $c mal durch $s ausgetauscht, Ergebnis der falschen Insert ist das gleiche. Nur hat sich das ganze noch weiter verschoben. Also sry ich find den Fehler dabei einfach nicht.
Beitrag zuletzt geändert: 9.4.2011 0:54:17 von siteplayer -
Wenn das zweite
angehängt wird (Zeile 20 im geposteten Codeabschnitt), wurde bereits vorher zwangsläufig das ersteINSERT INTO `'.$table.'` ('.$columns.') VALUES
in Zeile 13 im geposteten Codeabschnitt angehängt. Somit steht dann, wenn die Bedingung für das zweite Anhängen erfüllt ist,INSERT INTO `'.$table.'` ('.$columns.') VALUES
in der Variable. Das macht keinen Sinn, da ist ein Denkfehler drin.INSERT INTO `'.$table.'` ('.$columns.') VALUES INSERT INTO `'.$table.'` ('.$columns.') VALUES
-
Es steht nicht da, da das erste nicht in der Schleife stand und zudem das zweite erst nach hundert Beiträgen zum ersten mal erfüllt wurde!
Zudem habe ich die erste Zeile gelöscht und die zweite gegen folgende ausgetauscht
Trotzdem hilft mir das bei meinem Problem kein Stück weiter.if((preg_match("/([1-9]00|[1-9]000|[1-9]0000|[1-9]00000)/", $c))||($c == 0)) { $datei .= ' INSERT INTO `'.$table.'` ('.$columns.') VALUES '; }
INSERT INTO `phpbb_privmsgs` (...) VALUES (901, ...), (902, ...), ... (990, ...), (991, ...); (992, ...); ... (999, ...); (1000, ...); INSERT INTO `phpbb_privmsgs` (...) VALUES (1001, ...), INSERT INTO `phpbb_privmsgs` (...) VALUES (1002, ...),
Beitrag zuletzt geändert: 9.4.2011 16:12:44 von siteplayer -
Das, was ich genannt habe, ist der allgemeine Logikfehler in den Script. In dem Regex ist aber auch einer. Ist doch logisch, dass 1001 passt, wenn u.A. nach 100 gesucht wird. In der 1001 kommt die 100 vor.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage