php mysqli在准备好的声明中重复了字段

时间:2017-11-08 07:36:59

标签: php mysqli prepared-statement

我需要将现有项目从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中会变得非常混乱。

任何解决方案? 谢谢。

2 个答案:

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

然后将此变量绑定为整个值。所以不会再有重复变量了。