我有一个函数来检查用户试图添加到 mySQL 数据库中的数据条目是否存在。虽然我不允许 DB 表中的元组允许插入重复项,但此功能只是为了用户的利益,以便他们通过易于理解的错误消息知道为什么他们的数据输入被拒绝。
所以有两个数字要检查,都是唯一的,在示例中列为 ourNum => $ourNum 和 venNum => $venNum。问题是,当 func 检查第一个数组元素 (ourNum) 时,由于 mysqli_query 成功而失败,结果 $errMsg 显示它是 $venNum 已经存在,而不是 $ourNum。现在 $venNum 实际上,实际上应该证明也是重复的,因为 $ourNum 只能与有效的 $venNum 一起存在于数据库中>,但使用信息是错误的,而且明显是错误的。
function eqpt_num_dupe_check( $ourNum, $venNum, &$errMsg ){
// create associative array to hold ourNum => $ourNum and venNum => $venNum
$eqptNumArr = array(
'ourNum' => $ourNum,
'venNum' => $venNum );
// check for duplicate eqptNum entry
foreach ( $eqptNumArr as $eqpt => $num ) {
$sqlQ = "SELECT * FROM table WHERE $eqpt = $num";
if ( $rs = mysqli_query( $dbcon, $sqlQ ) ) { // if $rs is assigned then eqptNum already exists in DB, so display errMsg for user
$errMsg = 'Data entry refused: ' . $eqpt . ': ' . $num . ' already exists in database.';
}
}
}
在第一个元素的数据重复性 $errMsg 显示给用户之前,似乎 foreach 已经移动到数组的第二个元素上。
最佳答案
在$errMsg
赋值后,需要在if
条件中添加一个break
,这样当有重复数据时,就不会再进行处理了发现。
if ( $rs = mysqli_query( $dbcon, $sqlQ ) ) { // if $rs is assigned then eqptNum already exists in DB, so display errMsg for user
$errMsg = 'Data entry refused: ' . $eqpt . ': ' . $num . ' already exists in database.';
break;
}
如果没有 break
,foreach
会愉快地继续加载后续的数组元素,处理每个元素,直到没有更多元素要加载为止。 break
恰好在发现重复数据时停止此处理,因此将为用户显示正确的 $errMsg
。如果 $venNum
也被证明是重复的,那么只有当用户为 $ourNum
输入唯一值时,它才会被正确检测到。
if (!$rs)
然后加载下一个数组元素并运行 mysqli_query
以检查其可能的重复性。
关于php - foreach 循环根据当前条件将不正确的 str 值分配给错误 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42228236/