将数据从数组插入mysql

时间:2017-07-23 08:39:14

标签: php mysql arrays

我在将数组值插入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数据库写入任何内容。有人能说清楚我做错了吗?非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

在这个问题上有很多建议和改进。

  • 准备您的已删除数据 - 我将留给您优化您的xpath查询,以便只处理所需的值。一般来说,执行迭代条件以删除不需要的值不太干净。
  • 避免尽可能多地声明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连接数据库

更新2018.06

$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}");