我在将数组值插入mysql时遇到问题。我有一个数组$列表,其中包含30个项目。我想将数组中的每个值插入到数据库“title”列中的新行。
我已经检查了php手册,看来array_walk似乎是最好的选择。下面是创建数组并尝试将其添加到数据库的代码(此时它创建了30个空行)。该数组确实包含30个项目。
$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' );
据我所知,$ array_walk变量应该将函数sql()应用于$ list中的每个值,但它不会向mysql数据库写入任何内容。有人能说清楚我做错了吗?非常感谢任何帮助!
答案 0 :(得分:1)
在这个问题上有很多建议和改进。
global
变量(作为安全和清洁的最佳实践)。相反,将所有必要的变量作为参数传递(在这种情况下为$titles
)。title
数据来自外部(并且不应该被视为安全数据),因此您必须实施mysqli&#34;准备好的语句&#34; (或者如果您愿意,可以使用PDO)使用占位符和参数绑定。有三种有效的方法(我能想到)来做到这一点。我将推荐并编写两种方法,仅引用第三种方法。如果您不熟悉下面显示的功能或技术,我强烈建议您花时间通过PHP手册研究mysqli准备好的语句,绑定和执行。
如果您在研究后有具体问题,请发表评论,我会帮您解决。
方法#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
}
}
方法#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
}
}
使用call_user_func_array()
:Bind Param with array of parameters
以下是一些用于演示目的的显示数据:(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'));
输出:
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',...
编辑:
我想指出方法#2的一行可以是&#34; smarten-ed up&#34;和str_repeat()
一点点。此外,如果您使用的是PHP 5.6+,则可以使用&#34; splat&#34; ...
的第二个参数上的运算符(bind_param()
)
参考:https://stackoverflow.com/a/23641033/2943403
if($stmt->bind_param(str_repeat('s',sizeof($titles)), ...$titles) && $stmt->execute()){
答案 1 :(得分:0)
试试这段代码:
$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')");
编辑1.您必须执行查询
编辑2.使用foreach
列出阵列
编辑3.使用mysqli_connect
连接数据库
$nodelist = $xpath->query("//span[@class='mp-listing-title']");
$list = array();
foreach ($nodelist as $n) {
for ($i=5;$i<=35;$i++) {
$value = $n->nodeValue;
$list[] = $value;
}
}
$db = mysqli_connect(<your db details here>);
$values = "";
foreach ($list as $item) {
$values .= ", (values here)";
$values = substr($values, 1);
mysqli_query($db, "INSERT INTO table_name (field_names) VALUES {$values}");