Dynami c Подготовленный оператор Готовая функция, которая готовит оператор ТОЛЬКО ОДИН РАЗ - PullRequest
0 голосов
/ 20 января 2020

Мне нужна функция, которая готовит оператор только один раз. (Не каждый раз, когда вызывается функция для одного и того же запроса).
Потому что одним из преимуществ подготовленного оператора является: подготовка запроса выполняется только один раз (хотя оператор выполняется несколько раз)

Поэтому всякий раз, когда я вызываю эту функцию, она будет каждый раз подготавливать оператор, и это неправильно, потому что мы упустим одно из самых больших преимуществ Подготовленного оператора. Таким образом, я поставил Условие if( !empty($stmtName) and !isset($GLOBALS[$stmtName]) ), что Заявка на проверку уже установлена ​​или нет. (Если не тогда, и только тогда будет подготовлено заявление), используя это, мы покроем это преимущество. Но, Он генерирует Ошибка привязки параметра.

Моя функция здесь ...

function qryInsert( $stmtName, $table, $field, $params, $formats )
    {

        $query = " INSERT INTO ".$table
                ." ".( (isset($field) and !empty($field)) ? " ( ".(implode(", ",$field))." ) " : " " ). " "
                ." VALUES( ". implode(", ", array_map(function($val) { return "?"; }, $field))." ) ";

        /*if(!isset($con) or empty($con))
        {
            $con = $this->connection();
        }*/


        $a_params = array();


        $a_params = array();

        $param_type = '';
        $n = count($formats);

        for($i = 0; $i < $n; $i++)
        {
            $param_type .= $formats[$i];
        }

        $a_params[] = & $param_type;

        for($i = 0; $i < $n; $i++)
        {
            $a_params[] = & $params[$i];
        }

        if( !empty($stmtName) and !isset($GLOBALS[$stmtName]) )
        {
            $GLOBALS[$stmtName] = $GLOBALS['con']->prepare($query);
            // $stmt = $con->prepare($query);
        }

        if(!($GLOBALS[$stmtName]))
        {
            echo " Prepare failed: (" . $con->errno . ") " . $con->error; // . " <br> Query : <span style='color:tomato;'> ".$query." </span>"
        }
        else
        {

            if(!(call_user_func_array(array($GLOBALS[$stmtName], 'bind_param'), $a_params)))
            {
                echo "Binding parameters failed: (" . $GLOBALS[$stmtName]->errno . ") " . $GLOBALS[$stmtName]->error;
            }
            else
            {
                if(!($GLOBALS[$stmtName]->execute()))
                {
                    echo "Execute failed: (" . $GLOBALS[$stmtName]->errno . ") " . $GLOBALS[$stmtName]->error;
                }
                else
                {
                    if($meta = $GLOBALS[$stmtName]->result_metadata())
                    {
                        while ($field = $meta->fetch_field())
                        {
                            $columns[] = &$row[$field->name];
                        }

                        if(call_user_func_array(array($GLOBALS[$stmtName], 'bind_result'), $columns))
                        {
                            while ($GLOBALS[$stmtName]->fetch())
                            {
                                foreach($row as $key => $val)
                                {
                                    $x[$key] = $val;
                                }
                                $results[] = $x;
                            }
                        }
                        else
                        {
                            echo " Error occur while Bindig Result...";
                        }
                    }
                }
            }
        }

        $GLOBALS[$stmtName]->close();

        return $results;
    }

ВХОД:

qryInsert("insStud", "student_master", array("roll_no","name"), array(21,"Mahetab"), array("i","s"));
qryInsert("insStud", "student_master", array("roll_no","name"), array(8,"Sahil"), array("i","s"));
qryInsert("insStud", "student_master", array("roll_no","name"), array(10,"Mahammad"), array("i","s"));

ВЫХОД:

First time Record will Insert...
After that raised Binding Parameter failed error...

Без этого условия if( !empty($stmtName) and !isset($GLOBALS[$stmtName]) )

Мой код работает нормально ... У него нет проблем ... Потому что он будет готовить оператор каждый раз

Я использовал переменную $ GLOBALS, чтобы при вызове функции она использовала одну и ту же переменную GLOBALS. В противном случае функция Выполните операцию с их приватная переменная, которая не работает должным образом

1 Ответ

0 голосов
/ 15 февраля 2020

Проблема решена ...
Просто хочет удалить $GLOBALS[$stmtName]->close(); оператор ...
Поскольку он закрывает оператор каждый раз, когда вызывается функция ...
Итак, параметры привязки не выполнены ...

...