【问题标题】:Binding array of values in prepared statement PDO PHP在准备好的语句 PDO PHP 中绑定值数组
【发布时间】:2015-07-13 08:18:06
【问题描述】:

我正在尝试将我的值绑定到 PDO 中的准备好的语句中。

以下是使用准备好的语句块的先决条件代码:

$tab = 'air_user';
$fie = array('USER_NAME', 'USER_PASSWORD' , 'USER_EMAIL');
$name = $_POST['name'];
$pass = $_POST['password'];
$email = $_POST['email'];
$val = array(
    'name' => $name,
    'pass' => $pass,
    'email' => $email
);
$this->connect($tab,$fie,$val);

这是我准备这些值并进行必要插入的部分:

public function connect($table,$fields,$values)
{

    try{
        $con = new PDO ('mysql:host=localhost;dbname=air','root','123456');
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

        $fields = implode(", ", $fields);
        echo $fields;
        $values = implode(", ", $values);
        echo $values;

        // have to make this prevent sql injection //
        $stmt = $con->prepare("INSERT INTO $table(ID,$fields) VALUES (?,?,?,?)");
        $stmt->execute(array('',$values));

    } catch(PDOException $e) {
        die("this cant connect the database");
    }
}

那么为什么我的 INSERT 不起作用?谁能帮我看看,我试了很多东西,都不行。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    不,不要implode你要在->execute()中传递的值,它必须是一个数组:

    $fields = implode(", ", $fields);
    // $values = implode(", ", $values); // DONT IMPLODE!
    $values = array_values($values);
    
    $stmt = $con->prepare("INSERT INTO $table(ID,$fields) VALUES (NULL, ?,?,?)");
    $stmt->execute($values);
    

    或者@Augwa 的建议:

    // $fields = implode(", ", $fields); // not needed
    // $values = implode(", ", $values); // DONT IMPLODE!
    
    $placeholders = substr(str_repeat('?,', sizeOf($fields)), 0, -1);
    // $placeholders = implode(', ', array_fill(0, count($values), '?'));
    
    $stmt = $con->prepare(
        sprintf(
            "INSERT INTO %s (%s) VALUES (%s)", 
            $table, 
            implode(',', $fields), 
            $placeholders
        )
    );
    $stmt->execute($values);
    

    【讨论】:

    • 虽然以上是正确的,但您也可以将 ID 全部省略。
    • @Darren 你也可以发布同样的想法,只是之前按下了回答按钮:D
    • 对不起,我还是不能让它工作,好吧它没有 PDO 错误了,但是没有数据插入到数据库中。
    • @user3233074 因为您使用的是问号占位符,请使用array_values 删除$values 中的关联索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2010-11-05
    • 2014-03-12
    • 2012-08-05
    • 2016-09-04
    • 2016-09-10
    相关资源
    最近更新 更多