//变量在此函数之外声明。我使用$_POST
使用html表单标记检索另一个.php文件中的每个用户输入。变量$db
是我的数据库连接。
function 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>';
}
答案 0 :(得分:0)
bindParam()
返回true
或false
:
if($stmt->bindParam(':firstname', $avar)) {
echo 'Woo hoo yay!';
} else {
echo 'Boo hoo waa';
}
答案 1 :(得分:0)
如果PDO有错误,这不是你的问题。它是PDO的 - 因为它经过了相当好的测试,目前的PDO版本中存在很少的错误。也就是说,如果你告诉 PDO要绑定,那么相信它将绑定(如果未绑定execute上失败>参数,所以我们甚至不必相信&#34;它太多了。
但是,使用PDOStatement::bindValue
(不是bindParam,特殊情况除外),因为bindValue将确保提供的值被绑定,而不仅仅是#[34]引用[变量] &#34 ;.这可以防止&#34;意外更改&#34;从影响查询到绑定和执行之间的变量。
写一个Data-Access Layer (DAL) 1 ,而不是内联spaghetti SQL,然后 test 它。虽然确保参数是&#34;实际绑定&#34;听起来很有用,它并不能确保代码在语义上有效。例如,如果代码错误地执行了$stmt->bindParam(':firstname', $lastname);
?
此外,PDO本身将失败(我建议enabling Exceptions)在大多数基本&#34;绑定失败&#34; (例如未绑定的参数或不可转换的值)在执行查询时,如果参数是&#34;实际绑定&#34;则具有测试的本质。不太重要。
由于检测绑定与确定代码的有效性 无关,因此PDO也无法报告确切因SQL而存储的数据< em>转换问题(包括截断),那么问题实际上不是关于检查每个绑定,而是关于检查操作 - 并且DAL为不同的操作提供有保证的合同。
1 DAL不一定要吓人,也不必使用&#34; ORM&#34;或者&#34; OOP&#34;或&#34; DI / IOC&#34;或其他任何东西(虽然高级DAL可能会使用所有这些&#34;概念&#34;)。首先考虑一个单独包含的文件中的少数几个函数,它们是唯一机制,用于连接数据库和&#34;与&#34;交谈。 SQL。
这些函数中的每一个都有一个简单的契约(作为顶部的文档),它定义了它所采用的参数,它返回的结果,以及它可能抛出的任何异常。
恭喜,您已经创建了一个最小且可测试的DAL!
然后这个DAL,现在只是一组函数,可以在&#34;实际程序&#34; 之外 (最好使用现有的测试框架/线束)。
答案 2 :(得分:-1)
完全避免使用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);
}