php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.12.2011, 22:15  
Neuer Benutzer
 
Registriert seit: 18.12.2011
Beiträge: 3
PHP-Kenntnisse:
Anfänger
Exedo befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Eingabe teilen und in Datenbank schreiben

Guten Abend,

ich habe ein Problem mit einer Formulareingabe, die ich in die Datenbank schreiben möchte.
Die Eingabe sieht z.B. wie folgt aus:
Code:
2782*4*6*12#2739*2*7*0#43618*1*3*0
a*b*c*d # a*b*c*d # a*b*c*d #
Die Sternchen trennen a-b-c-d und die Raute beginnt das Spiel von vorn. Diese Eingabe kann beliebig lang sein, aber muss nach diesem Muster erfolgen.
Die Daten sollen in eine Datenbank geschrieben werden:
Code:
a     b   c   d
2782  4   6   12
2739  2   7   0
43618 1   3   0
Ich habe nun mit preg_split und foreach den ganzen Kram zerlegt, stehe aber nun vor der Frage wie ich das alles in die DB schreibe!?

PHP-Code:
# Eingabe vom Formular = 2782*4*6*12#2739*2*7*0#43618*1*3*0

echo $_POST['schnelleingabe'];
    
echo 
"<br /><br />";
    echo 
"<pre>";
    
$eingabe preg_split("/\#/"$_POST['schnelleingabe'], -1PREG_SPLIT_OFFSET_CAPTURE);
    
print_r ($row);
    echo 
"</pre>";

    foreach (
$eingabe as $bla)
    {
        foreach (
$bla as $blubb => $muh)
        {
            
$row2 preg_split("/\*/"$muh, -1PREG_SPLIT_OFFSET_CAPTURE);
            foreach (
$row2 as $bla2)
            {
                foreach (
$bla2 as $blubb2 => $muh2)
                {
                    if (
$blubb2 == 0) echo "muh2 = $muh2 <br /><br />";
                }
            }
        } 
Bitte nichts wegen den Variablennamen sagen, ich hab zum ausprobieren einfach irgendwas genommen. Das wird noch geändert, wenns denn läuft.

Die Ausgabe:
Code:
Array
(
    [0] => Array
        (
            [0] => 2782*4*6*12
            [1] => 0
        )

    [1] => Array
        (
            [0] => 2739*2*7*0
            [1] => 12
        )

    [2] => Array
        (
            [0] => 43618*1*3*0
            [1] => 23
        )

)


muh2 = 2782

muh2 = 4

muh2 = 6

muh2 = 12

muh2 = 0

muh2 = 2739

muh2 = 2

muh2 = 7

muh2 = 0

muh2 = 12

muh2 = 43618

muh2 = 1

muh2 = 3

muh2 = 0

muh2 = 23
Wenn mir da jemand einen Denkanstoß zwecks speichern in der Datenbank geben kann, wäre ich sehr dankbar Auch für Vorschläge bezüglich des obigen codes bin ich offen. Ich kann mir kaum vorstellen,dass so viele verschachtelte foreach Schleifen ok sind.


Gruß
Exedo ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.12.2011, 22:40  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

PHP-Code:
$in explode('#'$_POST['schnelleingabe']);

$db = new PDO('...''...''...');
$stmt $db->prepare('INSERT INTO table ( a, b, c, d ) VALUES ( :a, :b, :c, :d )');

foreach ( 
$in as $seq ) {
   
$data explode('*'$seq);
   
$stmt->bindValue(':a'$data[0], PDO::PARAM_INT);
   
$stmt->bindValue(':b'$data[1], PDO::PARAM_INT);
   
$stmt->bindValue(':c'$data[2], PDO::PARAM_INT);
   
$stmt->bindValue(':d'$data[3], PDO::PARAM_INT);
   if ( !
$stmt->execute() ) throw Exception('Oh noes, i got an unknown error of doom.');

Denk-Anstoß genug ? Falls nein -> Datenbank Grundlagentutorial studieren bitte.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 18.12.2011, 22:43  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Zitat:
Auch für Vorschläge bezüglich des obigen codes bin ich offen.
PHP-Code:
$stupidValues '2782*4*6*12#2739*2*7*0#43618*1*3*0';
$resultArray array_mapcreate_function('$var''return explode("*", $var);'), explode('#'$stupidValues) );

print_r$resultArray ); 
...woher diese Art von Datengrundlage nun wieder kommt, will ich gar nicht wissen...

Zwecks Denkanstoß DB -> siehe tr0y (wobei da ja bereits die obige Funktionalität enthalten ist) oder schau mal im Manual nach mysqli.
btw. wie sehen Deine Ansätze in Bezug auf DB denn aus?
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 18.12.2011, 23:17  
Neuer Benutzer
 
Registriert seit: 18.12.2011
Beiträge: 3
PHP-Kenntnisse:
Anfänger
Exedo befindet sich auf einem aufstrebenden Ast
Standard

Herzlichen Dank tr0y! Der große Denkanstoß war explode! An diese Funktion hatte ich nicht gedacht.
Den Rest verstehe ich allerdings noch nicht so recht, da muss ich mich erst noch schlaulesen. Und bevor ich irgendwas kopiere was ich selbst nicht verstehe, hab ich es so gelöst. Ich hoffe das ist auch ok:
PHP-Code:
    $del explode("#"$_POST['schnelleingabe']);
    
    foreach (
$del as $sin)
    {
        
$data explode("*"$sin);
        
$query mysql_query("INSERT INTO lieferung (lnr,europal,kisten,matten) VALUES('$data[0]', '$data[1]', '$data[2]', '$data[3]')");
        if (!
$query) echo mysql_error();
    } 
Der Code ist geschrumpft und das Ergebnis ist auch vorhanden. Mein Problem waren vorhin die mehrdimensionalen Arrays. Das hat mich etwas verwirrt.

@Arne Drews:
Zitat:
...woher diese Art von Datengrundlage nun wieder kommt, will ich gar nicht wissen...
Es ist eigentlich mehr ein Übungsscript auf Grundlage meiner Firma. Man kann in ein Formular eingeben, wieviele Europaletten, Kisten und Anti-Rutsch-Matten pro Lieferung verwendet werden. Dazu probiere ich mit einer Art Schnelleingabe rum, in die man nicht in jedes Formularfeld etwas eintippen muss, sondern alles in Zeile schreiben kann - getrennt durch * und #
Eine solche Eingabe ist mit dem Handy schneller, wenn man grad keinen PC in der Nähe hat
Deinen Code werde ich mir bei Gelegenheit auch noch näher zu Gemüte führen, bzw. das Manual zu den Befehlen studieren.

Vielen Dank für die Hilfe!!

Gruß
Exedo ist offline   Mit Zitat antworten
Alt 19.12.2011, 07:35  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Niemals, werte "exploden" und direkt in die DB schreiben. Mein Snippet oben bereitet die Werte direkt auf ( bindValue() über PDO ), wandelt diese direkt in Integer um. Dieser Prozess schützt deine Datenbank davor Opfer einer SQL-Injection zu werden. Ein findiger Benutzer könnte sonst so seine Datenbank-Anweisungen durch * und # trennen und deine Datenbank damit kompromitieren. Als alternative zu meinem schon geposteten Source, das ganze auf deinen Source umgemünzt und stark vereinfacht:

PHP-Code:
$del explode('#'$_POST['schnelleingabe']);
$errors = array();

foreach ( 
$del as $sin ) {
   
// do it for each row:

   // explode the row to columns
   
$data explode('*'$sin);

   
// sanitize each column and cast it to integer, to prevent sql injection
   
$data array_map(function( $item ) { return (integer)$item; }, $data);

   
// fill temporary vars with array_values
   
list( $a$b$c$d ) = $data;
   
   
// build SQL Query, remember all values are Integer !
   
$query mysql_query("INSERT INTO lieferung ( lnr, europal, kisten, matten ) VALUES ( $a, $b, $c, $d )");

   
// on SQL error append the error to $error-array
   
if ( !$query $errors[] = mysql_error();

   
// trash temporary vars
   
unset($a,$b,$c,$d);
}

// on error
if ( (bool)count($errors) ) {
   
// add leading message:
   
array_unshift($errors'Datenbank-Fehler bei der Verarbeitung der Schnelleingabe:');

   
// and throw each message seperated by an <br /> to the client
   
echo join('<br />'$errors);

statt
PHP-Code:
$data array_map(function( $item ) { return (integer)$item; }, $data);
list( 
$a$b$c$d ) = $data
kannst du natürlich auch das verwenden:
PHP-Code:
$a = (integer)$data[0];
$b = (integer)$data[1];
$c = (integer)$data[2];
$d = (integer)$data[3]; 
kommt auf das selbe hinaus, ersteres ist nur kürzer, lesestoff:
PHP:
array_map, list

Generell:
- http://de.wikipedia.org/wiki/SQL-Injection (DE)
- auch nicht uninteressant: http://en.wikipedia.org/wiki/Data_sa...code_injection (EN)

alternativ dazu das ganze aufs wesentliche gekürzt:

PHP-Code:
$fastInsert array_map(function ( $item ) {
   return 
array_map(function( $innerItem ) {
      return (integer)
$innerItem;
   }, 
explode('*'$item));
}, 
explode('#'$_POST['schnelleingabe']));

$errors = array();

foreach ( 
$fastInsert as $row ) {
   list ( 
$a$b$c$d ) = $row;
   
$query mysql_query("INSERT INTO lieferung ( lnr, europal, kisten, matten ) VALUES ( $a, $b, $c, $d )");
   if ( !
$query $errors[] = mysql_error();
}

if ( (bool)
count($errors) ) {
   
array_unshift($errors'Datenbank-Fehler bei der Verarbeitung der Schnelleingabe:');
   echo 
join('<br />'$errors);

__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (19.12.2011 um 08:00 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 19.12.2011, 08:01  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von tr0y
statt
PHP-Code:
$data array_map(function( $item ) { return (integer)$item; }, $data);
list( 
$a$b$c$d ) = $data
kannst du natürlich auch das verwenden:
PHP-Code:
$a = (integer)$data[0];
$b = (integer)$data[1];
$c = (integer)$data[2];
$d = (integer)$data[3]; 
Oder das:
PHP-Code:
list( $a$b$c$d ) = array_map'intval'$data ); 
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 19.12.2011, 08:04  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

ich find die Angabe eines Lambda's als Callback schlüssiger als die simple angabe eines Strings der einen Funktionsnamen repräsentiert, aber ich glaub das is hier Jacke wie Hose
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 19.12.2011, 11:06  
Neuer Benutzer
 
Registriert seit: 18.12.2011
Beiträge: 3
PHP-Kenntnisse:
Anfänger
Exedo befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tr0y Beitrag anzeigen
Niemals, werte "exploden" und direkt in die DB schreiben.
Mein Codeschnippsel oben war eigentlich nur ein "es funktioniert". Ich wollte die Eingabe vor dem exploden eigentlich per preg_match auf korrekte Eingabe prüfen.
Das war jetzt ein Anfang von gestern Abend:
PHP-Code:
### Fehlerüberprüfung ###                
    
$errortext="";            // leere Error-Variable. Wird bei Fehlern gefüllt. Wenn leer, dann wird in DB geschrieben.
    
if (empty($_POST['schnelleingabe'])) $errortext .= "Eingabe fehlt!<br />\n";
    if (
preg_match("/^[a-z0-9\*#]*$/i"$_POST['schnelleingabe']) == 0$errortext .= "Ungültige Zeichen vorhanden<br />Erlaubt: <b>A-Z 0-9 * #</b><br />\n";
    if (!empty(
$errortext)) echo "<div class='errorbox'>{$errortext}</div>";
//TODO:RegEx Überprüfung einfügen

    
    
if (empty($errortext))
    {
        
$del explode("#"$_POST['schnelleingabe']);
        foreach (
$del as $sin)
//[...]
    

Soll aber eigentlich noch soweit erweitert werden, dass die Eingabe bis zum ersten * maximal acht Zeichen lang ist, alphanumerisch ist und anschließend nur noch Ziffern, * und # kommen darf.
Deine Variante ist aber irgendwie eleganter. Ich müsste nur data[0] alphanumerisch erlauben, anstatt integer, was zu deiner Alternative führen würde:

Zitat:
Zitat von tr0y Beitrag anzeigen
kannst du natürlich auch das verwenden:
PHP-Code:
$a $data[0];
$b = (integer)$data[1];
$c = (integer)$data[2];
$d = (integer)$data[3]; 
Ich werde mir deine Funktionen erstmal genauer ansehen und dann wahrscheinlich die Geschichte etwas umbauen. Hab wieder viel dazu gelernt!
Vielen Dank für die tolle Erklärung.
Exedo ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hilfe: datenbank mappen und kopieren M*I*B Datenbanken 29 15.02.2012 21:55
Einfaches login ohne Sessions mit Datenbank aschunk Datenbanken 4 23.04.2010 11:24
Allgemein Werte in Datenbank updaten chunky PHP Tipps 2010 1 08.04.2010 22:35
Datenbank richtig aufgebaut? bageleudi Datenbanken 2 31.03.2010 21:01
[Erledigt] Eingabe vom Formularfeld mit Datenbank vergleichen Andre3000 PHP Tipps 2010 3 26.02.2010 13:44
Datenbank austauschbar machen durch Trennung von konkreter Implementierung Asipak PHP-Fortgeschrittene 10 04.09.2009 00:11
[Erledigt] Im- / Export einer MySQL Datenbank amaier161 Datenbanken 5 19.07.2009 00:42
Eingabe Datenbank - IDs verlinken bamberg PHP Tipps 2009 7 21.06.2009 21:19
Abfrage ob Eingabe mit Datenbank übereinstimmt!! PHP Tipps 2005-2 1 03.10.2005 15:37
Mehrere Anwendungen eine Datenbank... Datenbanken 5 15.08.2005 11:22
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:33
[Erledigt] mysql datenbank anlegen...aber WIE??? PHP Tipps 2005-2 0 05.08.2005 19:33
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:32
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:31
[Erledigt] mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:31

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
formular eingabe spliten in php

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:31 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum