Ari*_*osh 5 php mysql mysqli prepared-statement
当MySQLi语句很小时,它们非常易于使用.但是,一旦有超过一定数量的有界参数,就很难跟踪s并i同步属性.如下例所示:
$query = "INSERT INTO transaction_table (eventide, proxid, valid, fname, lame, email, studentid, status, affiliation, grade, error_statement, gender, netid, residence, school, department, major1, major2, dob, type, level) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
if($stmt = $mysqli->prepare($query)){
$grade_new = gradeChanger($grade);
$stmt->bind_param('iiisssiisssssissssiss',$_POST['pid'],$_POST['proxid'],$valid,$fname,$lname,$email,$studentid,$status,$affiliation,$grade_new,$error_submit,$gender,$netid,$residence,$school,$department,$major1,$major2,$dob,$type,$level);
$stmt->execute();
$stmt->close();
}
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法来分离i和s?像这样,我觉得如果你能够bind_param分组,就像这样,它会更容易阅读.无论如何还有这样的事吗?
$stmt->bind_param('iiis', $_POST['pid'], $_POST['proxid'], $valid, $fname);
$stmt->bind_param('ssii', $lname, $email, $studentid, $status);
$stmt->bind_param('sass', $affiliation, $grade_new, $error_submit, $gender);
$stmt->bind_param('siss', $netid, $residence, $school, $department);
$stmt->bind_param('ssiss', $major1, $major2, $dob, $type, $level);
Run Code Online (Sandbox Code Playgroud)
是切换到的唯一解决方案PDO吗?
一种方法是动态调用该bind_param方法.您显然知道是使用i还是s使用每个变量,所以让我们把所有这些都放入一个数组中(按照正确的顺序).
$params = array(
array('i', $_POST['pid']),
array('i', $_POST['proxid']),
array('i', $valid),
array('s', $fname),
// etc.
);
Run Code Online (Sandbox Code Playgroud)
然后你可以循环这个来构建传递给的"格式字符串" bind_param.
$bind_params = array('');
foreach($params as &$vals){
$bind_params[0] .= $vals[0];
$bind_params[] =& $vals[1];
}
call_user_func_array(array($stmt, 'bind_param'), $bind_params);
Run Code Online (Sandbox Code Playgroud)
这样可以让您更轻松地添加/删除值并跟踪它们.
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |