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()){
einen String in einer Variablen bedeutet das Zuweisen nicht, dass Sie eine Abfrage ausführen. Bitte lesen Sie alle PHP-MySQL-Tutorial. –
Ihre Abfrage ist nicht sicher. Bitte lies meine umfassende Antwort. – mickmackusa