2014-06-12 49 views
0

我嘗試使用PHP和MySQL進行PDO插入的方式有什麼問題?從Web表單插入PDO

MySQL數據庫使用與($ _POST)變量相同的名稱。

<?php 
if (!empty($_POST)) { 

//Declare Database Variables Here 

$dblist = ($_POST); 
$keys = array_keys($data); 

$dbcols = join(', ', array_values($keys)); 
$data = join(', ',array_values($dblist)); 

$dbtype = "mysql"; 
$dbhost = '127.0.0.1'; 
$dbname = 'bpstalent'; 
$dbuser = 'root'; 
$psword = 'root'; 
$portno = 3306; 

// if table_name is submitted, display dynamic table with another form request for table name 

$pdo = new PDO('mysql:host=' . $dbhost . ';port=' . $portno . 'dbname=' . $dbname . ';' . $dbuser . ';' . $psword . ';'); 

    echo "form submitted"; 

$sql = "INSERT INTO 'applicants'($dbcols) VALUES ($data)"; 

$stmt = $pdo->prepare($sql); 

$stmt->execute(); 

} 

else { 

?> 

HTML這裏

<? 
    ;} 
?> 
+0

改變''applicants''爲'applicants' –

+0

回聲出$ sql'echo $ sql'然後使用phpmyadmin或類似的工具來查看錯誤是什麼。 – RiggsFolly

+0

給我發送echo $ sql的輸出; –

回答

0

另外的形式,我覺得你是一個容易的目標SQL注入。我會改變

$sql = "INSERT INTO 'applicants'($dbcols) VALUES ($data)"; 

和替換的$值的列的硬編碼列表dbcols(它們可能來自一個數組爲好,只是沒有一個用戶發送)

對於$的數據我會取代與params什麼是由bindValue()處理。您可以通過用「,:」替換「,」來將名稱轉換爲段落持有者。如果附和你最終的查詢會是這個樣子:

$sql = "INSERT INTO applicants (col1, col2, col3) VALUES (:col1, :col2, :col3)"; 

PHP中的文檔這個例子中,這將是值得你的時間,以確保這種形式:

http://www.php.net/manual/en/pdostatement.bindvalue.php

下面是一個經過改進的樣本你的腳本,未經測試,但應該給你如何使事情更安全的想法:

<?php 
if ($_POST) { 

    //HARDCODE COLUMNS, DO NOT RELY ON USER INPUT, BAD THINGS WILL HAPPEN IF YOU DO 
    $keys = array("col1", "col2", "col3"); 

    $dbcols = '`'.join('`, `', $keys).'`'; 
    $placeholders = ':'.join(', :', $keys); 

    //RUN THROUGH POST DATA LOOKING FOR YOUR KEYS, ONLY PASS TO DATABASE DATA YOU ARE EXPECTING TO SEE 
    $data = array(); 
    foreach ($keys as $k) 
    { 
     $data[$k] = $_POST[$k]; 
    } 

    //CONSIDER REPLACING THIS WITH require_once() FILE 
    $dbtype = "mysql"; 
    $dbhost = '127.0.0.1'; 
    $dbname = 'bpstalent'; 
    $dbuser = 'root'; 
    $psword = 'root'; 
    $portno = 3306; 

    $pdo = new PDO("$dbtype:host=$dbhost;port=$portno;dbname=$dbname", $dbuser, $psword); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $sql = "INSERT INTO applicants ($dbcols) VALUES ($placeholders)"; 
    $stmt = $pdo->prepare($sql); 
    $stmt->execute($data); 
} 
+0

酷,酷。我會給這個測試。我剛剛意識到我需要在col名稱的起始處使用冒號。要明確,我應該使用每個表單域的名稱手動創建一個數組?在大多數例子中,我已經看到了,很高興知道,因爲某種原因,人際交往實踐。 – Newbian

+0

是的,在你的情況下,你應該對這些名字進行硬編碼,這樣SQL查詢中傳遞的任何東西都儘可能地被控制。如果使用像Symfony這樣的框架,可以通過創建實體文件(類)來完成。在執行查詢之前,儘可能多地關注用戶輸入和審覈。另外,如果你手動查看錶單驗證,那麼有一些獨立的類可以對你的表單值做一些額外的檢查,例如,它是一個數字,是'x'字符長等。 – Radek

+0

@Newbian你應該遵循至少* basic *語法,你可以從手冊中學習。你錯誤地認爲這個網站有免費的編碼服務。這個網站的目的不是爲你帶來一個有效的代碼。你對PDO構造函數參數的想法是錯誤的。如果你不能從變量動態創建它 - 更好地使用硬編碼值。 –