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

Php 如何测试PDO是否成功绑定了我的变量?,php,pdo,Php,Pdo,//变量在此函数之外声明。我使用$\u POST使用html表单标记检索另一个.php文件中的每个用户输入。变量$db是我的数据库连接 函数insertintodb($db、$avar、$bvar、$cvar) { /* 在使用PDO bindParam时,我如何知道我的变量是什么值?我输出$avar以在此函数中查看其值。我如何知道PDO是否实际将“:firstname”绑定到$avar?其他变量也是如此。 */ echo'在之前; echo$avar; 回声“”; //firstname、mi

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

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

echo'在
之前; echo$avar; 回声“
”; //firstname、midinital和lastname是数据库中的值。 //name是我要插入的表。 $insertname=“插入到名称中(firstname、midinital、lastname) 值(:firstname,:midname,:lastname)”; 回显“PDO准备前
”; echo$avar; 回声“
”; $stmt=$db->prepare($insertname); $stmt->bindParam(':firstname',$avar); $stmt->bindParam(':midname',$bvar); $stmt->bindParam(':lastname',$cvar); echo“使用bindParam绑定变量后”; echo$avar; 回声“
”; $stmt->execute(); 回显“执行后
”; echo$avar; 回声“
”; }
bindParam()
返回
true
false

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将在
执行时失败,因此我们甚至不必太“信任”它)

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

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

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

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


1 DAL不必吓人,也不必使用“ORM”或“OOP”或“DI/IOC”或其他任何东西(尽管高级DAL可能使用所有这些“概念”)。首先,考虑单独包含的文件中的一小部分函数,它们是连接到数据库和“与SQL”对话的唯一机制。 然后,这些函数中的每一个都有一个简单的契约(作为顶部的文档),该契约定义了它接受的参数、返回的结果以及它可能抛出的任何异常

祝贺您,您已经创建了一个最小的可测试DAL


然后这个DAL,目前只是一个函数集合,可以在“实际程序”之外进行测试/验证(最好使用现有的测试框架/工具)。

定义“成功”mysql.log是唯一可以从准备状态找到插值sql查询的地方如果没有引发异常,只需执行查询。如果结果正确,则变量绑定正确。查询是在DB上准备的,因此无法查看完整的SQL查询。@user2864740是的,这就是我的意思。我的错:你敢认真地建议检查每个绑定参数以“确保正确性”?那工作太多了!那么$stmt->bindParam(':firstname',$avar)返回一个bool值?这适用于所有PDO语句吗?@user2864740:我不是在建议,我是在回答“我如何测试PDO是否成功绑定了我的变量?”你对这个问题有更好的答案吗?user2864740-我想知道关于代码的一切。从开始到结束。@user2864740永远不要质疑堆栈溢出参与者。他们不介意。他们只是回答一个问题,真的吗?我必须处理无数的
s?不,谢谢!这可能会导致更微妙/严重的错误(即,可转换值排序错误),IMOHO。当必须在标准SQL中对列进行排序时,这些已经够可怕的了:|@user2864740如果您想处理20个单词而不是单个字符标记,则由您决定:)我不!这就是我要问的,这如何“减轻”总体负担
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);
}