PDO插入,foreach($ _ POST)

时间:2014-09-08 17:19:05

标签: php sql pdo

我的代码不会插入到我的数据库中。我不知道我的错误在哪里。 (感谢关于sql注入的通知,将阅读关于该laters< 3)

到目前为止,这是我的PHP代码:

$sqlArray = array();
$nameArray = array();
$valueArray = array();

foreach($_POST as $name => $value) {
    //$sqlArray[] = "':".$name."'=>$".$name;
    $nameArray[] = $name;
    $valueArray[] = "'".$value."'";
}

$names = implode(', ', $nameArray);
$values = implode(', ', $valueArray);

$sql = "INSERT INTO random ( ".$names." ) VALUES ( ".$values." )";


$addRandom = $dbh->prepare( $sql );
$addRandom->execute();

$ sql的输出如下:

INSERT INTO random ( random1, random2, zipCode) VALUES ( 'Namn', 'Adress', 'Zipcode' )

我应该更改或添加什么?

2 个答案:

答案 0 :(得分:1)

您已经在使用PDO库,这对初学者有好处,但是您并没有完全利用通信方法,因为它足够了:

$sqlArray = array();
$nameArray = array();
$valueArray = array();

$insertSQL = "INSERT INTO random ([[tablename]]) VALUES (?);";

$whiteList = array(
    'random1',
    'random2',
    'zipCode',
    ...
);

function whiteListedColumn($whiteList, $columnName){
    if (in_array($columnName, $whiteList)){
         return true;
    }

    return false;
}

function prepareStatement($dbHandler, $templateSQL, $columnName){
    $completeSQL = str_replace('[[tablename]]', $columnName, $templateSQL);
    return $dbHandler->prepare($completeSQL);
}

try{
    foreach($_POST AS $name => $value) {
        if (whiteListedColumn($whiteList, $name)){
           $prepStmt = prepareStatement($dbh, $insertSQL, $name);
           $prepStmt->execute(array($value));
        }
    }
}catch(Exception $e){
    echo "Error has occured while inserting data.";
}

我重构了插入查询,以合并我将在execute步骤使用的通配符绑定器(传入一组值绑定到查询中指定的相应位置)通过?标记)。

您正在传递列名称,因此要清理它们,我们不会采取手动转义任何不良字符的路线,但我们将采用将输入与已接受列的白名单进行比较的路线预定义的名称 - 这样,1)不会威胁数据库一致性的任何事情,2)对数据库的语义有效将被允许,其他一切都将导致执行部分被完全忽略。

答案 1 :(得分:-1)

正确准备您的查询,并设置连接错误模式,其他一切似乎没问题:

/* Very very important !!*/
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$names = implode(', ', $nameArray);
$values = implode(', ', ':'.$nameArray);

$sql = "INSERT INTO random ( ".$names." ) VALUES ( ".$values." )";
$addRandom = $dbh->prepare( $sql );

foreach($_POST as $name => $value) {
    $addRandom->bindValue($name, $value);
}

$addRandom->execute();

if($addRandom->rowCount > 0){
    echo 'INSERTED';
}else{
    echo 'FAILED';
}

注意 您的$_POST键应与您绑定的字段名称匹配,否则它将无效。