当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();
}
是否有更简单的方法来区分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);
是切换到PDO
的唯一解决方案吗?
答案 0 :(得分:5)
一种方法是动态调用bind_param
方法。您显然知道是否对每个变量使用i
或s
,所以让我们将所有这些变量放入一个数组中(按照正确的顺序)。
$params = array(
array('i', $_POST['pid']),
array('i', $_POST['proxid']),
array('i', $valid),
array('s', $fname),
// etc.
);
然后你可以循环遍历这个以构建“格式字符串”以传递给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);
这样可以让您更轻松地添加/删除值并跟踪它们。
答案 1 :(得分:1)
我更喜欢使用命名参数,例如:pid
,:proxy
等。我知道PDOStatment::bindParam
支持此功能。
答案 2 :(得分:1)
是的,此时,最好使用PDO而不是mysqli。 PDO也是面向对象的。
$db = new PDO($dsn, $user, $pass); $stmt = $db->prepare("INSERT INTO users (name, age) VALUES (:name,:age)"); $stmt->execute(array(':name' => $name1, ':age' => $age1)); $stmt->execute(array(':name' => $name2, ':age' => $age2));