kostenloser Webspace werbefrei: lima-city


preg_match fehler

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    siteplayer

    siteplayer hat kostenlosen Webspace.

    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;
    		}
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
    INSERT INTO `'.$table.'` ('.$columns.') VALUES
    INSERT INTO `'.$table.'` ('.$columns.') VALUES
    macht aber keinen Sinn.
  4. Autor dieses Themas

    siteplayer

    siteplayer hat kostenlosen Webspace.

    Das zweite
    INSERT INTO `'.$table.'` ('.$columns.') VALUES
    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 ersten
    INSERT INTO `'.$table.'` ('.$columns.') VALUES
    kommt noch ein
    $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
    if(preg_match("/([1-9]00|[1-9]000|[1-9]0000|[1-9]00000)/", $c))
    {
    	$datei .= '
    INSERT INTO `'.$table.'` ('.$columns.') VALUES
    ';
    	echo $c;
    }
    Obwohl sich nichts an den Daten und dem Code geändert hat hat sich das ganze verschoben.
    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
  5. Wenn das zweite
    INSERT INTO `'.$table.'` ('.$columns.') VALUES
    angehängt wird (Zeile 20 im geposteten Codeabschnitt), wurde bereits vorher zwangsläufig das erste
    INSERT 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
    INSERT INTO `'.$table.'` ('.$columns.') VALUES
    in der Variable. Das macht keinen Sinn, da ist ein Denkfehler drin.
  6. Autor dieses Themas

    siteplayer

    siteplayer hat kostenlosen Webspace.

    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
    if((preg_match("/([1-9]00|[1-9]000|[1-9]0000|[1-9]00000)/", $c))||($c == 0))
    {
    	$datei .= '
    INSERT INTO `'.$table.'` ('.$columns.') VALUES
    ';
    }
    Trotzdem hilft mir das bei meinem Problem kein Stück weiter.
    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
  7. 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.
  8. Autor dieses Themas

    siteplayer

    siteplayer hat kostenlosen Webspace.

    Ok das hab ich voll vergessen x.x
    Vielen dank, jetzt funzt alles wieder :biggrin:
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!