2017-07-23 9 views
0

Ich habe Probleme beim Einfügen von Array-Werte in mysql. Ich habe eine Array $ -Liste, die 30 Elemente enthält. Ich möchte jeden Wert in das Array in einer neuen Zeile in der Spalte "Titel" in meiner Datenbank einfügen.Einfügen von Daten aus dem Array in mysql

Ich habe das PHP-Handbuch überprüft und es scheint Array_walk wäre die beste Wahl hier. Hier ist der Code, der das Array erstellt und versucht, es zur Datenbank hinzuzufügen (in dem Moment, in dem 30 leere Zeilen erstellt werden). Das Array enthält die 30 Elemente.

$nodelist = $xpath->query("//span[@class='mp-listing-title']"); 

    $list = array(); 

    $i = 0; 

    foreach ($nodelist as $n) { 
    if ($i >=5 && $i <=35) { 
     $value = $n->nodeValue; 
     $list[] = $value; 
    } 
    $i++; 
    } 

    function sql() { 

    global $table_id; 
    global $array_walk; 

     $sql = "INSERT INTO $table_id (title) VALUES ('$array_walk')"; 
     } 

    $array_walk = array_walk($list, 'sql'); 

Zu meinem Verständnis der $ array_walk Variable sollte Funktion sql() auf jeden Wert in $ Liste anwenden, aber es ist nicht auf die MySQL-Datenbank zu schreiben etwas. Kann jemand etwas Licht auf das werfen, was ich falsch mache? Jede Hilfe wird sehr geschätzt!

+2

einen String in einer Variablen bedeutet das Zuweisen nicht, dass Sie eine Abfrage ausführen. Bitte lesen Sie alle PHP-MySQL-Tutorial. –

+0

Ihre Abfrage ist nicht sicher. Bitte lies meine umfassende Antwort. – mickmackusa

Antwort

0

Versuchen Sie diesen Code:

$nodelist = $xpath->query("//span[@class='mp-listing-title']"); 
$list = array(); 
$i = 0; 
foreach ($nodelist as $n) { 
    if ($i >=5 && $i <=35) { 
     $value = $n->nodeValue; 
     $list[] = $value; 
    } 
    $i++; 
} 

$db = mysqli_connect(<your db details here>); 

foreach ($list as $item) { 
    mysqli_query($db, "INSERT INTO $table_id (title) VALUES ('$item')"); 

EDIT 1. Sie Abfrage ausführen müssen
EDIT 2. Verwenden Sie foreach für die Auflistung Array
EDIT 3. mysqli_connect Datenbank verwenden viele Empfehlungen

+0

Danke, es funktioniert nach dem Ersetzen von $ array_walk mit $ item. – Peter

0

Es gibt eine Verbindung und Verfeinerungen zu dieser Frage anbieten.

  • Bereiten Sie Ihre Scraped-Daten vor - ich überlasse es Ihnen, Ihre Xpath-Abfrage zu verfeinern, so dass nur die gewünschten Werte verarbeitet werden. Im Allgemeinen ist es weniger sauber, iterierte Bedingungen auszuführen, um unerwünschte Werte zu entfernen.
  • Vermeiden Sie es, global Variablen so weit wie möglich zu deklarieren (in Bezug auf Sicherheit und Sauberkeit). Übergeben Sie stattdessen alle notwendigen Variablen als Argumente ($titles in diesem Fall).
  • Da Ihre title Daten extern bezogen werden (und nicht als sicher gelten sollten), ist es wichtig, dass Sie die "prepared statements" von mysqli (oder PDO, wenn Sie so wollen) mit Platzhaltern und Parameterbindung implementieren. Es gibt drei gültige Möglichkeiten (die ich mir vorstellen kann), dies zu tun. Ich werde zwei Methoden empfehlen und schreiben und nur eine dritte referenzieren.
  • Ich habe in meinen Funktionen eine ganze Batterie von Fehlerprüfungen während des gesamten Prozesses eingebaut. Denken Sie daran, dass Sie keine rohen Fehlermeldungen an Benutzer anzeigen dürfen - geben Sie nur die generalisierten/vagen Fehlermeldungen an.
  • Wenn Sie mit den unten aufgeführten Funktionen oder Techniken nicht vertraut sind, empfehle ich Ihnen dringend, die Zeit zu nutzen, um die vorbereiteten Anweisungen, die Bindung und die Ausführung von mysqli im PHP-Handbuch zu recherchieren.

    Wenn Sie spezielle Fragen nach der Forschung haben, lassen Sie bitte einen Kommentar und ich werde Ihnen helfen.

    Methode 1:

    function shortPreparedInsert($titles){ 
        return "INSERT INTO Titles_TableName (title) VALUES (?)"; // for demo only 
        if(sizeof($titles)!=30){ 
         return "Query aborted: Titles data not = 30"; 
        }elseif(!$conn=new mysqli($server,$user,$password,$database)){ // apply your credentials here 
         return "Connection Error: ".$conn->connect_error; // do not echo error info when live/public 
        }elseif($stmt=$conn->prepare("INSERT INTO `Titles_TableName` (`title`) VALUES (?)")){ 
         $stmt->bind_param("s",$title); 
         foreach($titles as $title){ 
          if(!$stmt->execute()){ // this will execute 30 times using each title 
           return "Execution Error on $title: ".$stmt->error; // do not echo error info when live/public 
          } 
         } 
         return "Titles created successfully"; 
        }else{ 
         echo "Prepare Error: ",$conn->error; // do not echo when public 
        } 
    } 
    

    Methode # 2:

    function longPreparedInsert($titles){ 
        return "INSERT INTO Titles_TableName (title) VALUES ".implode(',',array_fill(0,sizeof($titles),'(?)')); // for demo only 
        if(sizeof($titles)!=30){ 
         return "Query aborted: Titles data not = 30"; 
        }elseif(!$conn=new mysqli($server,$user,$password,$database)){ // apply your credentials here 
         return "Connection Error: ".$conn->connect_error; // do not echo error info when live/public 
        }elseif($stmt=$conn->prepare("INSERT INTO Titles_TableName (title) VALUES ".implode(',',array_fill(0,sizeof($titles),'(?)')))){ 
         if($stmt->bind_param('ssssssssssssssssssssssssssssss', 
            $titles[0],$titles[1],$titles[2],$titles[3],$titles[4], 
            $titles[5],$titles[6],$titles[7],$titles[8],$titles[9], 
            $titles[10],$titles[11],$titles[12],$titles[13],$titles[14], 
            $titles[15],$titles[16],$titles[17],$titles[18],$titles[19], 
            $titles[20],$titles[21],$titles[22],$titles[23],$titles[24], 
            $titles[25],$titles[26],$titles[27],$titles[28],$titles[29]) && $stmt->execute()){ 
          return "Titles created successfully"; 
         }else{ 
          return "Query Failed, Syntax Error: ".$stmt->error; // do not echo error info when live/public 
         } 
        }else{ 
         echo "Prepare Error: ",$conn->error; // do not echo when public 
        } 
    } 
    

    Eine weniger modern, aber noch gültig dritte Methode call_user_func_array() Verwendung: Bind Param with array of parameters

    Hier einige Daten für demonstrativen angezeigt Zwecke: (Demo Link)

    echo shortPreparedInsert(array_column(array_slice($titlehit,5,30),'nodeValue')); // array_slice will re-index the keys since no 4th parameter 
    echo "\n\n"; 
    echo longPreparedInsert(array_column(array_slice($titlehit,5,30),'nodeValue')); // array_slice will re-index the keys since no 4th parameter 
    echo "\n\n"; 
    var_export(array_column(array_slice($titlehit,5,30),'nodeValue')); 
    

    Output:

    INSERT INTO Titles_TableName (title) VALUES (?) 
    
    INSERT INTO Titles_TableName (title) VALUES (?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?) 
    
    array (
        0 => 'Gitaarversterker kopen? Ontdek 18 Gitaarwinkels in Benelux', 
        1 => 'Gibson Les Paul ** Nr.1 Gibson dealer ** 18 gitaarwinkels', 
        2 => 'Gitaarstandaard Gitaarstandaards Gitaarstatief Aanbieding!', 
        3 => 'Gravity GS01WMB Gitaar muurbeugel', 
        4 => 'Gitaaronderdelenshop.nl - Betaalbare gitaaronderdelen', 
        5 => 'Hartke basgitaar + versterker',... 
    

    EDIT:

    Ich mag würde eine Zeile der Methode # 2 kann "smarten-ED-up", darauf hinzuweisen, dass ein wenig mit str_repeat(). Wenn Sie PHP 5.6+ verwenden, können Sie außerdem einen "splat" -Operator (...) auf dem zweiten Parameter bind_param() verwenden.
    Referenz: https://stackoverflow.com/a/23641033/2943403

    if($stmt->bind_param(str_repeat('s',sizeof($titles)), ...$titles) && $stmt->execute()){ 
    
    +0

    @Peter Ich werde diese Antwort an Ort und Stelle lassen, weil ich denke, dass es eine umfassendere/umfassendere Antwort ist, die immer noch wertvoll ist, ohne darüber zu sprechen, wie man die xpath-Daten am besten filtert. Die derzeit akzeptierte Antwort fördert nicht den SEHR NÜTZLICH vorbereiteten Statement-Aspekt des Aufrufs von MySQL-Abfragen mit externen Daten; und es wird vorgeschlagen, 30 separate Abfragen auszuführen - was nicht großartig ist. Dies ist eine grüne Tick-würdige Antwort. – mickmackusa