【问题标题】:PHP: Inserting Multiple array into mysql tablePHP:将多个数组插入 mysql 表
【发布时间】:2016-10-19 04:34:54
【问题描述】:

我正在测试将多个数组插入到我的表中,我已经尽我所能但我没有得到。这是我的代码:

<?php

    ini_set('display_errors',1);
    //ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

                    $mysqli = new mysqli(HOST,USER,PASS,DB);
                     $message = array();    

                    $id =1;
                    $SocialHandle = "Facebook,Twitter,LinkIn";
                    $SociaUrl ="Url1,Url2,Url3";

                    $strSocialHandle = explode(',', $SocialHandle); 
                    $strSociaUrl = explode(',', $SociaUrl); 
                    print_r($strSocialHandle);
                    print_r($strSociaUrl);
                    $sql = "INSERT INTO `social_table`(`id`, `social_handle`, `handle_url`) VALUES";
                    foreach($strSocialHandle as $SocialNameValue){                                      
                    $sql .= "({$id}, '{$SocialNameValue}','{$strSociaUrl}'),";              
                    }
                    $sql = rtrim($sql, ',');
                    $result = $mysqli->query($sql);

                    if (!$result){
                            $message = array('Message' => 'insert fail or record exist');
                            echo json_encode($message);         
                    }else{             
                            $message = array('Message' => 'new record inserted');
                            echo json_encode($message);   
                    }
?>

这是我的目标成就:

ID      社交句柄 处理网址
1         Facebook 网址1
1 Twitter          url2
1 链接 网址3

请帮忙。

【问题讨论】:

  • 你有什么错误吗?
  • 是的:错误提示:数组到字符串的转换
  • 如果 ID 是主键 - 它应该是唯一的,(不重复值)
  • 是我数据库下的子表,所以该表没有唯一ID
  • 我认为我的问题出在哪里,我需要遍历这两个数组并将它们内爆,我不知道它是如何工作的

标签: php mysql sql optimization mysqli


【解决方案1】:

你可以使用 for 循环作为它

$id =1;
$SocialHandle = "Facebook,Twitter,LinkIn";
$SocialHandle = explode(",", $SocialHandle);
$SociaUrl = "Url1,Url2,Url3";
$SociaUrl = explode(",", $SociaUrl);

$sql = "INSERT INTO `social_table`(`id`, `social_handle`, `handle_url`) VALUES";
for ($i = 0; $i < count($SocialHandle); $i++) {
    $sql .= "({$id}, '$SocialHandle[$i]','$SociaUrl[$i]'),";
}


$sql = rtrim($sql, ',');
echo $sql;
$result = $mysqli->query($sql);

输出

插入social_table(id, social_handle, handle_url) 值(1,'Facebook','Url1'),(1,'Twitter','Url2'),(1, 'LinkIn','Url3')

DEMO

更新

最好使用prepare和bind语句来防止form sql注入

for ($i = 0; $i < count($SocialHandle); $i++) {
    $sql = "INSERT INTO `social_table`(`id`, `social_handle`, `handle_url`) VALUES (?,?,?)";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('iss', $id, $SocialHandle[$i], $SociaUrl[$i]);
    $stmt->execute();
}

【讨论】:

  • 谁对这个答案投了反对票
  • “更新”版本有多个插入;那要慢得多。
【解决方案2】:

您只是在循环$strSocialHandle - $strSociaUrl 数组不受循环影响,因此仍将是一个数组而不是单个值。您可以将这两个列表存储在一个键值数组中,并使用一个循环来遍历两者:

<?php
$id = 1;

$social = [
    'Facebook' => 'Url1',
    'Twitter'  => 'Url2',
    'LinkIn'   => 'Url3',
];


$sql = "INSERT INTO `social_table`(`id`, `social_handle`, `handle_url`) VALUES";

foreach($social as $handle => $url) {
    $sql .= "({$id}, '{$handle}','{$url}'),";
}

echo rtrim($sql, ',');

【讨论】:

  • 如果社交句柄像 BoobyTables';drop table users; ——?只是好奇。
  • Booby Tables 是否与 Bobby Tables 相关?
  • 由您决定。
猜你喜欢
  • 2017-07-03
  • 2012-06-13
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
相关资源
最近更新 更多