2017-08-31 120 views
-1

我想通過數組在數據庫中發送數據,但它沒有插入。如何從數組中插入數據

<?php 
if(isset($_POST['submit'])){ 
    $name=$_POST['name']; 
    $last=$_POST['last']; 
    $des=$_POST['des']; 
    $insData = array($name,$last,$des); 
    foreach ($insData as $key => $val){ 
     echo $val."<br>"; 
    } 
    $v = implode(", ", $val); 
    $query=mysqli_query($connect,"insert into name(name,last,des) VALUES ('$v')"); 
    if($query){ 
     echo "ok data"; 
    } 
    else { 
    echo mysqli_error($connect); 
    } 
} 
?> 
+1

您的代碼很容易受到SQL注入式攻擊。您應該使用參數化查詢和準備語句來幫助防止攻擊者通過使用惡意輸入值來危害數據庫。 http://bobby-tables.com/給出了風險的解釋,以及如何使用PHP/mysqli安全編寫查詢的一些示例。 – ADyson

+0

無論如何,檢查錯誤和變量的值。在implode調用期間,很可能$ val沒有值,因爲您嘗試在foreach循環的範圍之外使用它。你的意思是內爆$ insData嗎?但正如我上面所說,不要這樣做,使用適當的參數化查詢,除非你想讓自己容易受到黑客攻擊。任何值得閱讀的mysqli教程都應該說明如何做到這一點。 – ADyson

+0

您的代碼有邏輯錯誤,正如其他人所說,它的注射效果也非常差。你應該回頭看一些關於如何將數據插入數據庫的教程。我們實際上可以更正你的代碼,但你不會從中學到任何東西。正如我所看到的,您缺乏編程基礎知識,還包括變量範圍以及循環內變量的情況。 – Twinfriends

回答

1

看看這一行:

$query=mysqli_query($connect,"insert into name(name,last,des) VALUES ('$v')");

如果$v是等於說delboy1978uk,something,somethingelse,那麼你的SQL會是什麼樣子:

$query=mysqli_query($connect,"insert into name(name,last,des) VALUES ('delboy1978uk,something,somethingelse')");

,你可以看,那只是一個字符串。所以你也需要用一些單引號內爆。

$array = ['delboy1978uk', 'something', 'somethingelse']; 
$v = implode("','", $array); 
echo $v; 

這將輸出:

delboy1978uk','something','somethingelse

這意味着你的SQL字符串現在應該是有效的。

請記住,儘管您更好地使用綁定參數來防止SQL注入!看到這裏http://php.net/manual/en/mysqli-stmt.bind-param.php

0

你可以試試這個

簡單,但並不安全:

<?php 
    if(isset($_POST['submit'])){ 
     $name=$_POST['name']; 
     $last=$_POST['last']; 
     $des=$_POST['des']; 
     $insData = array($name,$last,$des); 
    foreach ($insData as $key => $val) { 
     echo $val."<br>"; 
    } 
    $v = implode("', '", $insData); 
     $query=mysqli_query($connect,"insert into name(name,last,des) VALUES ('$v')"); 
     if($query){ 
      echo "ok data"; 
     } 
     else 
     { 
      echo mysqli_error($connect); 
     } 
    } 
?> 
0

你的代碼格式不(見PSR-1 and PSR-2)。當你添加了一些錯誤處理時,你忽略了告訴我們你寫的代碼告訴你什麼。

至少有2個原因,你已經證明我們將不插入數據的代碼:

  • $連接不會初始化
  • 作爲輸出已經顯示你的SQL字符串廢話。如果您將字符串發送到屏幕而不是數據庫(或數據庫),您將看到如下所示的內容:

    插入名稱(name,last,des)VALUES('Zeenat,Nazir,des')

,您的查詢的格式應爲:

insert into name(name,last,des) VALUES ('Zeenat', 'Nazir', 'des') 

您的代碼很容易受到SQL注入。

撇開有關連接,這一問題的更好的方式來建立你的SQL是:

$sql="insert into name(name,last,des) VALUES ('" 
    . mysqli_real_escape_string($connection, $_POST['name']) . "','" 
    . mysqli_real_escape_string($connection, $_POST['last']) . "','" 
    . mysqli_real_escape_string($connection, $_POST['des']) . "')"; 
+0

參數化查詢會更好。與看似普遍的理解相反,mysqli_real_escape_string沒有提供對所有形式的注入攻擊的全面保護,並且不保證這樣做,因爲除了其他任何內容外,這不是函數的預期目的。 https://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string使一個很好的閱讀。同樣的問題適用於mysqli版本。 – ADyson

+0

@ADyson:我在這裏讀到你的評論非常激動 - mysql [i] _real_escape_string()不起作用的一個具體例子 - 但這根本不是一個例子。它僅僅是一個關於防止SQL注入的(常見的)假設的例子。這遠非證明參數綁定是優越的,mysql [i] _real_escape_string()仍然是處理可變參數列表的唯一方法。 – symcbean

+0

我從來沒有說過它沒有按預期工作,我說它並沒有阻止SQL注入。你的答案意味着它 - 你說「你的代碼容易受到SQL注入的攻擊」,接着是「...一個更好的方法來建立你的SQL將是...」,然後是一個仍然容易受到SQL注入攻擊的例子。所以我認爲澄清這一點可能是明智的。 – ADyson