Php MySQLi-当您的查询超过15个'';,西丝,你是怎么跟踪的?

Php MySQLi-当您的查询超过15个'';,西丝,你是怎么跟踪的?,php,mysql,mysqli,prepared-statement,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

当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
的唯一解决方案吗?

我更喜欢使用命名参数,如
:pid
:proxy
等。我知道
pdostation::bindParam
支持这一点


是的,在这一点上,最好使用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)); $db=新PDO($dsn,$user,$pass); $stmt=$db->prepare(“插入用户(姓名、年龄)值(:姓名、年龄)”); $stmt->execute(数组(':name'=>$name1',:age'=>$age1));
$stmt->execute(数组(':name'=>$name2',:age'=>$age2)) 一种方法是动态调用
bind_param
方法。很明显,您知道是对每个变量使用
i
还是
s
,所以让我们将所有这些都放入一个数组中(按照正确的顺序)

然后,您可以在此循环以构建“格式字符串”以传递到
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);

这将使您更容易添加/删除值并跟踪它们。

您可以使用命名参数。这样,您就不必手动计算
位置并试图记住是绑定参数#16还是#17。可以按任意顺序指定命名参数。但是它需要更多的->bind()-type调用什么阻止了您编写一个助手方法(或类),该方法接受一个值和类型数组,并调用带有适当参数的
bind_param
?您还可以通过适当地扩展mysqli类来无缝集成此代码@MaximeLorant@MarcB,mysqli不支持命名参数。老实说,我一直无法理解为什么mysqli(或任何其他数据库扩展)需要被告知数据类型。除了非常特殊的情况(限制子句不会将字符串转换为int),它似乎没有任何明显的用途。只有PDO支持这一点,而不是MySQLi(他正在使用)。我经常问自己与OP相同的问题,想知道是否有比OP使用的更简单的解决方案;这看起来很有希望。我很快就得测试一下。有人会想知道是否有一种方法可以简单地向POST变量添加一个额外的参数。例如(我可能会添加一个非常粗糙的例子)
$\u POST['pid']['I']
-
$\u POST['fname']['s']
等等@Fred ii-:这是我编出来的-D它似乎比其他解决方案略为简单。你的
$\u帖子
建议也可以奏效。这只是一个粗略的例子,你想怎么扩展就怎么扩展:-)啊,但你比我经验丰富得多;-)然而,如果我坚持使用turbopascal编程(许多月前),而没有正确转向图形艺术,我可能已经能够编写它了。turbopascal和PHP看起来非常相似。我现在才重新开始编程不到一年,而且还要学习数据库的东西,这使得我的工作有很多;-)lolHey Rocket,看看几分钟前作为另一个问题的答案出现了什么。就像我之前想的那样,用砂纸打磨和抛光边缘,它可以很好地工作;-)我会努力想出一些对我有利的东西,希望它能让我的生活更简单一些。
$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);