【问题标题】:How can I test if PDO successfully binded my variables?如何测试 PDO 是否成功绑定了我的变量?
【发布时间】:2014-03-27 19:02:21
【问题描述】:

//变量在这个函数之外声明。我使用$_POST 使用html 表单标记检索另一个.php 文件中的每个用户输入。变量$db 是我的数据库连接。

函数 insertintodb ($db, $avar, $bvar, $cvar) { /* 使用 PDO bindParam 时如何判断我的变量的值是什么?我输出 $avar 以查看它在此函数中的值。如何判断 PDO 是否真的将“:firstname”绑定到 $avar?其他变量也是如此。 */

echo 'before <br>';
echo $avar;
echo '<br>';

    //firstname, midinitial, lastname are values in my database.
    //name is my table I am inserting into.
$insertname = "INSERT INTO name (firstname, midinitial, lastname) 
VALUES (:firstname, :midname, :lastname)";

echo 'before PDO prepare<br>';
echo $avar;
echo '<br>';

$stmt = $db->prepare($insertname);

$stmt->bindParam(':firstname', $avar);
$stmt->bindParam(':midname', $bvar);
$stmt->bindParam(':lastname', $cvar);

echo 'after binding variables using bindParam <br>';
echo $avar;
echo '<br>';

$stmt->execute();

echo 'after executing <br>';
echo $avar;
echo '<br>';

}

【问题讨论】:

  • 定义“成功”
  • mysql.log 是唯一可以从准备好的语句中找到插入的 sql 查询的地方
  • 如果没有抛出异常,只执行查询。如果结果正确,则您的变量绑定正确。
  • 查询是在 DB 上准备的,因此无法查看完整的 SQL 查询。
  • @user2864740 是的,这就是我的意思。我的错:D

标签: php pdo


【解决方案1】:

bindParam() 返回truefalse

if($stmt->bindParam(':firstname', $avar)) {
    echo 'Woo hoo yay!';
} else {
    echo 'Boo hoo waa';
}

【讨论】:

  • 您是否认真建议检查 每个 绑定参数以“确保正确性”?工作量太大了!
  • 那么 $stmt->bindParam(':firstname',$avar) 返回一个布尔值?这适用于所有 PDO 语句吗?
  • @user2864740:我不建议,我正在回答 “如何测试 PDO 是否成功绑定了我的变量?” 你对这个问题有更好的答案吗?
  • user2864740 - 我喜欢了解关于代码的一切。从头到尾。
  • @user2864740 从不质疑 Stack Overflow 参与者。他们从不介意。他们只是回答一个问题。
【解决方案2】:

完全避免 bindParam。这将减轻您检查其结果的负担

function insertintodb ($db, $avar, $bvar, $cvar)
    $sql = "INSERT INTO name (firstname, midinitial, lastname) VALUES (?, ?, ?)";
    $stmt = $db->prepare($sql);
    $data = array_slice(func_get_args()); // lets strip $db from the func args
    $stmt->execute($data);
}

【讨论】:

  • 认真的吗?我必须处理无数个?s?不,谢谢!这可能导致更微妙/严重的错误(即可转换值的错误排序),IMOHO。当必须在标准 SQL 中对列进行排序时,这些已经够糟糕了:|
  • @user2864740 如果你想处理 20 个单词而不是单个字符标记 - 这取决于你 :)
  • 我没有!这就是我要问的,这如何总体上“减轻”负担? :)
【解决方案3】:

信任 PDO

如果 PDO 有错误,这不是您的问题。它是 PDO 的——因为它经过了很好的测试,所以在当前的 PDO 版本中几乎没有错误。也就是说,如果您告诉 PDO 绑定,那么相信它 绑定(如果有unbound 参数,PDO 将在execute 上失败,所以我们甚至不必太“信任”它)。

但是,请使用PDOStatement::bindValue(不是 bindParam,除非在特殊情况下),因为 bindValue 将确保提供的 value 是绑定的,而不仅仅是“引用 [对变量]”。这可以防止在绑定和执行之间对变量的“意外更改”影响查询。

编写和测试 DAL

一个Data-Access Layer (DAL)1,而不是内联意大利面条SQL,然后测试它。虽然确保参数“实际绑定”听起来很有用,但这并不能确保代码在语义上是有效的。例如,如果代码错误地执行了$stmt-&gt;bindParam(':firstname', $lastname);,该怎么办?

此外,在执行查询时,PDO 本身会在大多数基本的“绑定失败”(例如未绑定的参数或不可转换的值)上失败(我推荐 enabling Exceptions),这使得测试参数是否“实际上绑定”不太重要。

由于检测绑定与确定代码的有效性无关,PDO也不能准确报告由于SQL存储了哪些数据conversion 问题(包括截断),那么问题实际上不在于检查每个绑定,而在于检查操作 - DAL 为不同的操作提供有保证的合同。


1 DAL 不一定要吓人,也不必使用“ORM”或“OOP”或“DI/IOC”或其他任何东西(尽管高级 DAL 可能使用所有这些“概念”)。首先考虑一下单独包含的文件中的一小部分函数,​​它们是唯一用于连接到数据库和“与”SQL 对话的机制。

这些函数中的每一个都有一个简单的契约(作为顶部的文档),它定义了它所采用的参数、它返回的结果以及它可能抛出的任何异常。

恭喜,您创建了一个最小且可测试的 DAL!

然后,可以在“实际程序”之外(最好使用现有的测试框架/线束)获取和测试/验证这个 DAL,它现在只是一个功能集合。 /p>

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2013-12-19
    相关资源
    最近更新 更多