使用PDO预处理语句插入数组数据

时间:2014-03-06 20:14:23

标签: php sql pdo

我慢慢得到了PDO和准备好的声明,但有人可以澄清以下内容:

我知道您可以使用以下代码从数组中插入数据:

$values = array('bill', 'ben', 'bob');

$stmt = $db->prepare("INSERT INTO first_page_data(first_name) VALUES(:fname)");
$stmt->bindParam(':fname', $first_name, PDO::PARAM_STR);
foreach ($values as $first_name) {
    $stmt->execute();
}

这会将三个名称插入数据库中的3个新行,这里没问题!

但是,如果我有一个包含数据库列名的数组和包含这些值的相应数组,是否有一种方法可以在一个预准备语句中为同一个用户插入多个,而不是键入(相当单调)代码行:

$stmt = $db->prepare("INSERT INTO first_page_data(first_name,surname,phone_no,email,postcode) VALUES(:fname,:sname,:phone,:email,:postcode)");

IE在表名后的括号中,只是有一个数组变量而不是列出列名。

此外,如果我在预准备语句中使用未命名的占位符,是否可以从表单中迭代POST数组以将值绑定到?占位符? (而不是键入多个$stmt->bindValue(.......)行?

2 个答案:

答案 0 :(得分:1)

这是你要找的吗?

Binding multiple values in pdo

您可以传递一组值来在一次操作中绑定多个参数。

答案 1 :(得分:0)

对于你的另一个问题“有没有办法用像我这样的包含数字,字符串和布尔值的形式”这样做,那么我已经为你做了一个快速值的活页夹类。您所要做的就是确保PHP类型是正确的(如果是必须的,您可以将其转换为 - 例如$postcode = (int)$postcode)。某些时候->execute()上的KVP数组会在需要一个int时失败,例如在一个限制内 - 这不会失败。

<强>用法

<?php
    $stmt = $db->prepare("INSERT INTO first_page_data(first_name,surname,phone_no,email,postcode) VALUES(:fname,:sname,:phone,:email,:postcode)");

    PDO_Value_Binder::bindValues($stmt, array(
        'fname'    => 'Bob',          //Will be bound as PDO::PARAM_STR
        'sname'    => 'Bobson',       //Will be bound as PDO::PARAM_STR
        'phone'    => null,           //Will be bound as PDO::PARAM_NULL
        'email'    => 'my@email.com', //Will be bound as PDO::PARAM_STR
        'postcode' => 123             //Will be bound as PDO::PARAM_INT
    ));

    $stmt->execute();
?>

<强>类

<?php
    class PDO_Value_Binder {
        private static $pdoTypes = array(
            'boolean' => PDO::PARAM_BOOL,
            'integer' => PDO::PARAM_INT,
            'double'  => PDO::PARAM_INT,
            'string'  => PDO::PARAM_STR,
            'NULL'    => PDO::PARAM_NULL
        );

        public static function bindValue($statement, $paramName, $value, $pdoType = null) {
            if ($paramName[0] != ':') {
                $paramName = ':' . $paramName; //Add colon in case we forgot
            }

            if (empty($pdoType)) {
                $valueType = gettype($value); //Get the type of $value to match

                if (isset(self::$pdoTypes[$valueType])) {
                    $pdoType = self::$pdoTypes[$valueType]; //We know this
                } else {
                    $value = print_r($value, true); //Convert to string
                    $pdoType = PDO::PARAM_STR; //Default to a string
                }
            }

            return $statement->bindValue($paramName, $value, $pdoType);
        }

        public static function bindValues($statement, $paramKVP, $pdoType = null) {
            $return = true;

            foreach ($paramKVP as $paramName => $value) {
                $return = self::bindValue($statement, $paramName, $value, $pdoType) && $return;
            }

            return $return;
        }
    }
?>