我需要将现有项目从mysql转换为mysqli并使用预处理语句。
在现有项目中,有些查询使用重复的变量值。 一个这样的例子是:$ prev_yr使用3次。
$sqlins = "Insert into studentclass (`StudentID`, `ClassID`, `Year`, `Level`, `SNo`, `TermList`, `DateStart`, `DateEnd`)
select StudentID, '$prev_cl', '$prev_yr', '$prev_lvl', '', '123456789', '$prev_yr-01-01', '$prev_yr-12-31' from student Where StudentID in ($ids) ";
有没有比这更好的方法:
$sqlins = "Insert into studentclass (`StudentID`, `ClassID`, `Year`, `Level`, `SNo`, `TermList`, `DateStart`, `DateEnd`)
select StudentID, '?', '?', '?', '', '123456789', '?-01-01', '?-12-31' from student Where StudentID in (?) ";
$stmt = $mysqli->prepare($sqlins);
$stmt->bind_param("ssssss", $prev_cl,$prev_yr,$prev_lvl,$prev_yr,$prev_yr,$ids);
$stmt->execute();
我想知道是否有一种方法可以为所有3次事件绑定$ prev_yr一次。
因为在一个语句中有其他查询可能有2次出现$ prev_lvl,5次出现$ prev_yr等。这个想法是,当一个语句中多次变量的重复出现变得很多时 - 将它们排列在bind_param中会变得非常混乱。
任何解决方案? 谢谢。
答案 0 :(得分:2)
它甚至可以这样工作,通常你不会在查询中执行此操作'?-01-01'
。我在大约4年内没有使用过Mysqli,因为我现在使用的是PDO。但据我所知,当你发送它以准备时,它会在?
中插入一个字符串。
我会拆分它,实际上没有必要进行选择,因为唯一选择的是你已经拥有的studentID。简单地
$insert = $mysqli->prepare("Insert into studentclass (`StudentID`, `ClassID`, `Year`, `Level`, `SNo`, `TermList`, `DateStart`, `DateEnd`)VALUES(?, ?, ?, ?, ?, ?, ?, ?)");
foreach( $ids AS $id ){
$stmt->bind_param("issssiss", $id, $prev_cl,$prev_yr,$prev_lvl,'', '123456789', $prev_yr.'-01-01',$prev_yr.'-12-31');
$stmt->execute();
}
我无法测试它,所以希望我把所有东西都放在正确的位置。
正如我所说,我不认为你可以绑定到查询的Fields
部分,当然也不会绑定在部分字符串中,除了它正在进行一个不需要的选择。只需确保在循环之前准备插入。
很明显,选择实际从DB中获取的唯一内容是
select StudentID ... from student Where StudentID in (?)
其余的被添加为“假”列,我不知道它的用语。阅读原始查询很困难..
答案 1 :(得分:1)
我想知道是否有办法在所有3次出现时绑定$ prev_yr。
没有
此外,无论如何它都不会以这种方式工作,因为你不能只绑定你选择的任意查询部分。您只能绑定完整的数据文字。意味着代替'? - 01-01'它应该只是?,而在你的PHP代码中你应该成功
$dateStart = "$prev_yr-01-01";
然后将此变量绑定为整个值。所以不会再有重复变量了。