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

时间:2014-01-23 19:25:12

标签: php mysql mysqli prepared-statement

当MySQLi语句很小时,它们非常易于使用。但是,一旦您拥有超过一定数量的有界参数,就很难跟踪si已同步的属性。如下例所示:

$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();
}

是否有更简单的方法来区分is?像这样,我觉得如果你能够分组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的唯一解决方案吗?

3 个答案:

答案 0 :(得分:5)

一种方法是动态调用bind_param方法。您显然知道是否对每个变量使用is,所以让我们将所有这些变量放入一个数组中(按照正确的顺序)。

$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支持此功能。

http://us1.php.net/manual/en/pdostatement.bindparam.php

答案 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));