PDO:我能避免使用bindParam吗?

时间:2011-03-03 04:02:56

标签: php mysql data-binding pdo bind

我从某个地方修改了这段代码,但我不确定我是否正确地执行了此操作,

我使用方法将数据插入数据库,

# insert or update data
    public function query($query, $params=array())
    {
        try
        {
            $stmt = $this->connection->prepare($query);
            $params = is_array($params) ? $params : array($params);
            $stmt->execute($params);
            return true;
        }
        catch (PDOException $e) 
        {
            # call the get_error function
            $this->get_error($e);
        }
    }

然后我只需要这样称呼它,

$sql = "
    INSERT root_countries_cities_towns (
        tcc_names,
        cny_numberic,
        tcc_created
    )VALUES(
        ?,
        ?,
        NOW()
    )";

$pdo->query($sql,array('UK','000'));

完美无缺!但我不明白这条线的作用 - 有人可以解释一下吗?

$params = is_array($params) ? $params : array($params);

我认为我必须首先使用bindParam来绑定参数,但似乎我不再需要使用is方法 - 是否安全可靠

这是否意味着我不再需要以这种方式准备查询了?

$sql = "
        INSERT root_countries_cities_towns (
            tcc_names,
            cny_numberic,
            tcc_created
        )VALUES(
            :name,
            :numberic,
            NOW()
        )";

忘了这个绑定?

$stmt = bindParam(':name','UK', PDO::PARAM_STR);
$stmt = bindParam(':numberic','000', PDO::PARAM_STR);

感谢。

5 个答案:

答案 0 :(得分:3)

$params = is_array($params) ? $params : array($params);

只是检查$ params变量是否是一个数组,如果是这样,它会创建一个原始$ params值作为唯一元素的数组,并将该数组赋值给$ params。

这将允许您为查询方法提供单个变量,或者如果查询具有多个占位符,则提供变量数组。

它不使用bindParam的原因是因为值被传递给execute()方法。使用PDO,您可以使用多种方法将数据绑定到占位符:

  • bindParam
  • bindValue
  • 执行($值)

bindParam方法的一大优点是,如果循环数据数组,可以调用bindParam一次,将占位符绑定到特定的变量名称(即使该变量尚未定义),它将会每次执行语句时都获取指定变量的当前值。

答案 1 :(得分:3)

我猜这几乎是PHP语法问题而不是PDO问题。

$params = is_array($params) ? $params : array($params);

的短地(称为三元运算符))
if (is_array($params)) {
   $params = $params;
} else {
  $params = array($params);
}

我宁愿写为

if (!is_array($params)) $params = array($params);

这是非常不言自明的,几乎可以用简单的英语阅读:

  

如果$ params不是一个数组,那么让我们使用一个前$ params的值使它成为数组

这就是为什么我讨厌三元运算符(和lambdas)并且总是避免使用它。它使相当可读的代码陷入混乱。只是出于程序员的懒惰。

要回答您的其他问题,

  

这是否意味着我不再需要以这种方式准备查询了?

谁说的?您正在代码中准备好它,再次检查它。

  

忘了这个绑定?

这是真的。 execute($params)只是另一种绑定变量的方法。

答案 2 :(得分:1)

第一个示例将$params的内容转换为数组(如果它还不是数组)(例如,如果只传递了一个参数并且它作为单个项而不是数组传递长度1)。

这两个示例同样有效,除了对于第一个示例,引入数组$params的参数被注入到SQL查询中找到?的位置,而在第二个示例中,参数的格式化实际上是通过名称完成的(您将在sql中找到的参数名称绑定到实际参数)。

你应该使用第一个,写起来更容易。

答案 3 :(得分:0)

将数组传递给PDOStatement::execute()使用默认值(绑定类型等)通过PDOStatement::bindParam()(或者bindValues())传递数组中的每个条目。

基本上,它与预绑定一样安全。

使用bindParam的优点是它绑定到变量引用。这意味着您可以在不重新绑定的情况下更改变量的值,并使用新值执行该语句。这在循环中特别有用,例如

$vals = array('foo', 'bar', 'baz');
$stmt->bindParam(1, $val);
foreach ($vals as $val) {
    $stmt->execute(); // Executes once for each value in $vals
}

  

我不明白这条线的作用 - 有人可以解释一下吗?

该行将非数组转换为数组。

例如

$params = 'foo';
$params = is_array($params) ? $params : array($params);
$params == array('foo');

我想这是为了方便你只有一个占位符和一个要绑定的值的情况,因为PDOStatement::execute()只能传递一个数组。

答案 4 :(得分:-2)

试试这堂课。我经常使用PDO,这是我一直用于我的项目。PHP PDO Class on GitHub

相关问题