2017-04-20 53 views
0

目前我有一个数组,如下图所示,当输出通过print_r();插入数组在mysql数据库中使用php

Array ([0] => Array ([0] => 
Sri Chandrasekharendra Saraswathi Viswa Mahavidyalaya 

| Kanchipuram, Chennai 
[1] => 
Karpaga Vinayaga College of Engineering and Technology 

| Kanchipuram, Chennai 
[2] => 
SRM University, Chennai - Kattankulathur Campus 

| Kattankulathur, Chennai 
[3] => 
Saveetha University, Thandalam 

| Thandalam, Chennai 
[4] => 
B.S. Abdur Rahman Crescent University 

| Vandalur, Chennai 
[5] => 
P.B. College of Engineering 

| Sriperumbudur, Chennai 
[6] => 
Saveetha Engineering College 

| Thandalam, Chennai 
[7] => 
Hindustan University 

| Kelambakkam, Chennai 

我想插入这个数据到一个表中,每个元素值属于其各自的字段。

实际上是从网站上抓取数据。我使用了一些regex.all取出的数组包含30个值each.all数组包含了所需的结果,但不能找出如何将它们插入数据库.even你的方法也NT为我工作 为使用循环是:

for ($i=0;$i<30;$i++) 
{ $temp1 = $names[1][$i]; 
    $temp2 = $location[2][$i]; 
    $temp3 = $facilities[1][$i]; 
    $temp4 = $reviews[1][$i]; 





    $sql = 'INSERT INTO collegedb (Name,Location,Facilities,Reviews) VALUES ("$temp1","$temp2","$temp3","$temp4")'; 
$run=mysqli_query($dbconnect,$sql);} 

有人可以帮助我理解我应该怎么处理这个情况? 这里是完整的代码http://paste.ubuntu.com/24422534/

+1

变量不会像单引号一样工作。参数化查询将更安全/更可靠。 – chris85

+0

你能告诉如何? –

+0

当您的数据不包含任何设施或评论时,您如何期望提取设施和评论? – gview

回答

0

链接@ Clearshot66回答你的问题非常适合,所以这是多余的:如果你曾经考虑迁移到PDO比mysqli的好得多可能这可以帮助你:

$req = $conn->prepare('INSERT INTO document (nom,date_creation,prix,auteur) VALUES (:nom, :date_creation, :prix 
    , :auteur)'); 
    $req->execute(array('nom' => $document->getNom(), 'date_creation' => $document->getDateCreation() 
    , 'prix' => $document->getPrix(), 'auteur' => $document->getAuteur())); 

在数据库安全中插入类Document的对象的简单示例。祝你好运。

0

我不知道为什么人们告诉你使用PDO,当你清楚使用的mysqli

数据的格式是一场灾难,所以我就做了一些样本数据,我们可以工作与

$data = [ 
    'names' => ['first', 'second', 'third'], 
    'locations' => ['Berlin', 'Tokyo', 'Shanghai'], 
    'facilities' => [1, 4, 9], 
    'reviews' => ['good', 'best', 'average'] 
] 

的目标将是将数据插入到我们的表像这样

name  location facility review 
-------------------------------------- 
first  Berlin  1   good 
second Tokyo  4   best 
third  Shanghai 9   average 

在我们查询的基础上,我们将使用mysqli_prepare这是旨在用于(安全地)将变体数据注入查询中

mysqli_bind_param允许您注入整数,双精度,字符串和二进制斑点。在下面的例子中,我们将注入字符串s和整数i

// basic example 
$city = 'Reykjavik'; 
$stmt = $mysqli->prepare('select district from cities where city=?') 
$stmt->bind_param('s', $city); 
$stmt->execute(); 

你的情况,我们有数据寿的数组,所以我们需要执行我们的查询多次。幸运的是,我们可以准备一次陈述,并且绑定/执行多次。一个简单的循环会做的伎俩

// make the statement 
$stmt = $mysqli->prepare('insert into collegedb (Name, Location, Facilities, Reviews) VALUES (?, ?, ?, ?)'); 

// run it once for each set of values 
for ($i=0; $i < count(data['names']); $i++) { 
    $name = $data['names'][$i]; 
    $loc = $data['locations'][$i]; 
    $fac = $data['facilities'][$i]; 
    $rev = $data['reviews'][$i]; 
    $stmt->bind_param('ssis', $name, $loc, $fac, $rev); 
    $stmt->execute(); 
} 

// close the statement 
$stmt->close(); 

使用array_map使这更容易

如果您有最新的PHP版本,可以让这个解决方案要好很多使用array_map和图示论据。

// make the statement 
$stmt = $mysqli->prepare('insert into collegedb (Name, Location, Facilities, Reviews) VALUES (?, ?, ?, ?)'); 

// map over data 
array_map(function($name, $loc, $fac, $rev) { 
    $stmt->bind_param('ssis', $name, $loc, $fac, $rev); 
    $stmt->execute(); 
}, ...array_values($data)) 

// close the statement 
$stmt->close(); 

甚至更​​少手保持

使用array_map先前方法是好的,但在代码中伪装是2D阵列换位。相反,我们可以编写一个通用转置函数,然后首先转换您的数据,然后遍历它。这将导致更少的认知负荷整体

$entries = [ 
    ['first', 'Berlin', 1, 'good'], 
    ['second', 'Tokyo', 4, 'best'], 
    ['third', 'Shanghai', 9, 'average'] 
]; 

我们可以用我们方便array_transpose功能派生从$data$entries。然后循环数据并执行我们的语句变得容易很多

// reusable transpose function 
function array_transpose($xs) { 
    return array_map(null, ...array_values($xs)); 
} 

// derive entry data 
$entries = array_transpose($data); 

// make the statement 
$stmt = $mysqli->prepare('insert into collegedb (Name, Location, Facilities, Reviews) VALUES (?, ?, ?, ?)'); 

// run it once for each entry 
foreach ($entries as $values) { 
    $stmt->bind_param('ssis', ...$values); 
    $stmt->execute(); 
} 

// close the statement 
$stmt->close();