2017-04-20 69 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();