MySQLi - 当你的查询超过15'?'和sisisissssisisiss时,你如何跟踪?

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吗?

Roc*_*mat 5

一种方法是动态调用该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)

这样可以让您更轻松地添加/删除值并跟踪它们.