$ stmt-> bind_param ($ params) возможно? - PullRequest
0 голосов
/ 20 февраля 2012

Моя функция выглядит так.

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);) должно быть разным.

Итак, я хочу создать $params внутри switch

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

Тогда используйте это так

$stmt->bind_param($params);

Это возможно?

Ответы [ 4 ]

1 голос
/ 20 февраля 2012

Я не знаю, действительно ли это то, что вам нужно, но просто поместите вызовы prepare () и bind_param () внутри оператора case:

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"]);

itКажется, что вы должны предоставить все переменные при вызове оператора bind_param.Вы все еще можете вызвать bind_param с переменным количеством аргументов.см. комментарии к http://php.net/manual/de/mysqli-stmt.bind-param.php.

0 голосов
/ 12 марта 2013

Да, это вполне возможно, но я бы посоветовал не использовать mysqli и переходить на PDO, который работает именно так, как вы просите:

$stmt = $db->prepare($sql);
$stmt->execute($params);
$data = $stmt->fetchAll();
0 голосов
/ 12 марта 2013

Возможно, это больше не поможет 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 голосов
/ 20 февраля 2012

Вы можете связывать параметры внутри каждого оператора 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;
}
...