2012-02-20 23 views
0

我的功能看起來像那樣。

if (isset($_POST['type'])) { 
    switch ($_POST['type']) { 
     case "qsubject": 
      $sql = "SELECT id, name FROM chapters WHERE subject_id=?"; 
      break; 
     case "qchapters": 
      $sql = "SELECT id, name FROM sections WHERE subject_id=? AND chapter_id=?"; 
      break; 
     case "qsections": 
      $sql = "SELECT id, name FROM paragraphs WHERE subject_id=? AND chapter_id=? AND section_id=?"; 
      break; 
    } 
    $stmt = $db->prepare($sql) or die($db->error()); 
    $stmt->bind_param("i", $id); 
    $stmt->execute(); 
    $stmt->store_result(); 
    if ($stmt->num_rows > 0) { 
     $stmt->bind_result($chp_id, $name); 
     echo '<option value="#"></option>'; 
     while ($stmt->fetch()) 
      echo '<option value="' . $chp_id . '">' . $name . '</option>'; 
    } 
    else 
     echo 0; 
    $stmt->close(); 
} 

對於每一個開關殼體$params$stmt->bind_param($params);)必須是不同的。

所以我想要做的是創造$paramsswitch

$params='"i"'.$id; 

然後使用它像這樣

$stmt->bind_param($params); 

這可能嗎?

回答

1

我真的不知道這是否是你想要的,但只是把準備()和bind_param()調用的情況下,語句中:

if (isset($_POST['type'])) { 
    switch ($_POST['type']) { 
     case "qsubject": 
      $sql = "SELECT id, name FROM chapters WHERE subject_id=?"; 
      $stmt = $db->prepare($sql) or die($db->error()); 
      $stmt->bind_param("i", $id); 
      break; 
     case "qchapters": 
      $sql = "SELECT id, name FROM sections WHERE subject_id=? AND chapter_id=?"; 
      $stmt = $db->prepare($sql) or die($db->error()); 
      $stmt->bind_param("ii", $id, $chapter_id); 
      break; 
     case "qsections": 
      $sql = "SELECT id, name FROM paragraphs WHERE subject_id=? AND chapter_id=? AND section_id=?"; 
      $stmt = $db->prepare($sql) or die($db->error()); 
      $stmt->bind_param("iii", $id, $chapter_id, $section_id); 
      break; 
    } 
    $stmt->execute(); 
    $stmt->store_result(); 
    if ($stmt->num_rows > 0) { 
     $stmt->bind_result($chp_id, $name); 
     echo '<option value="#"></option>'; 
     while ($stmt->fetch()) 
      echo '<option value="' . $chp_id . '">' . $name . '</option>'; 
    } 
    else 
     echo 0; 
    $stmt->close(); 
} 

你正在做的3個不同的查詢,讓有3個不同的prepare() - 調用是完全正確的。

如果你不能使用這種方法,你也可以創建一個簡單的數組來存儲你的參數。

$params = array(); 
case "qsubject": 
    $params[] = array("type"=>"i", "value"=>$id); 
    break; 

case "qchapters": 
    $params[] = array("type"=>"i", "value"=>$id); 
    $params[] = array("type"=>"i", "value"=>$chapter_id); 
    break; 

// probably won't work, see text below. 
foreach ($params as $param) 
    $stmt->bind_param($param["type"], $param["value"]); 

看起來您必須在調用bind_param語句時提供所有變量。你仍然可以用變量數的參數調用bind_param。請參閱關於http://php.net/manual/de/mysqli-stmt.bind-param.php的解決方案的評論。

0

你可能每個case語句中的綁定參數,可以像下面:

switch ($_POST['type']) { 
    case "qsubject": 
     $sql = "SELECT id, name FROM chapters WHERE subject_id=?"; 
     $stmt = $db->prepare($sql) or die($db->error()); 
     $stmt->bind_param("i", $id); 
     break; 
    case "qchapters": 
     $sql = "SELECT id, name FROM sections WHERE subject_id=? AND chapter_id=?"; 
     $stmt = $db->prepare($sql) or die($db->error()); 
     $stmt->bind_param("ii", $id, $id1); 
     break; 
    case "qsections": 
     $sql = "SELECT id, name FROM paragraphs WHERE subject_id=? AND chapter_id=? AND section_id=?"; 
     $stmt = $db->prepare($sql) or die($db->error()); 
     $stmt->bind_param("iii", $id, $id1, $id2); 
     break; 
} 
+0

我知道這一點。但也許有可能擺脫我的想法額外的代碼片段? – 2012-02-20 15:13:11

+0

那麼,它會反正需要額外的代碼來擺脫冗餘代碼 – Abhay 2012-02-20 16:27:14

0

也許這將不利於OP了,但我的猜測是他真正想要的是動態創建一個數組(可變參數長度)綁定。

這可以通過使用

call_user_func_array() 

短示例來完成:

call_user_func_array(array($stmt, 'bind_param'), 
    array_merge(array($bindParamsString), $paramsToBind)); 

其中變量$bindParamsString對應於類型的參數(如「IIS」)和參數$paramsToBind是一個數組持有您想要綁定的值的參考:

$paramsToBind = array(&myFirstValue [,&mySecondValue [,..]); 
+0

爲什麼downvote?請給出意見。 – user654123 2013-03-11 21:14:53

-2

是的,這是很有可能的,但我建議不要使用mysqli並移動到PDO,它的工作方式完全按照您的要求:

$stmt = $db->prepare($sql); 
$stmt->execute($params); 
$data = $stmt->fetchAll();