我如何测试PDO是否成功绑定了我的变量


How can I test if PDO successfully binded my variables?

//变量在函数外部声明。我使用$_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>';
}

bindParam()返回truefalse:

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

完全避免使用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);
}

信任PDO

如果PDO有bug,这不是你的问题。它是PDO的——因为它经过了很好的测试,所以在当前的PDO版本中几乎没有bug。也就是说,如果你告诉 PDO绑定,那么相信它绑定(如果有未绑定的参数,PDO将在execute上失败,所以我们甚至不必太"信任"它)。但是,请使用PDOStatement::bindValue(而不是bindParam,除非在特殊情况下),因为bindValue将确保提供的是绑定的,而不仅仅是"对变量的引用"。这可以防止在绑定和执行之间对变量的"意外更改"影响查询。

编写并测试一个DAL

写入一个数据访问层(DAL)1,而不是内联的意大利式SQL,然后测试它。虽然确保参数"实际绑定"听起来很有用,但它并不能确保代码在语义上是有效的。例如,如果代码错误地执行了$stmt->bindParam(':firstname', $lastname);呢?

此外,在执行查询时,PDO本身将在大多数基本的"绑定失败"(例如未绑定的参数或不可转换的值)上失败(我建议启用Exceptions),这使得测试参数是否"实际绑定"的本质变得不那么重要。

由于检测绑定与确定代码的有效性无关,PDO也不能准确地报告由于SQL 转换问题(包括截断)而存储的数据,因此问题实际上不在于检查每个绑定,而在于检查操作-并且DAL为不同的操作提供了有保证的契约。


1一个DAL不必是可怕的,也不必使用"ORM"或"OOP"或"DI/IOC"或其他任何东西(尽管一个高级的DAL可能使用所有这些"概念")。对于初学者来说,考虑一个单独包含的文件中的一小部分函数,它们是唯一的机制,用于连接到数据库并"与"SQL"对话"。

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

恭喜你,你已经创建了一个最小的可测试的DAL!

那么这个DAL,现在只是一个函数的集合,可以在之外的"实际程序"(最好使用现有的测试框架/工具)

进行测试/验证