Мне нужна функция, которая готовит оператор только один раз. (Не каждый раз, когда вызывается функция для одного и того же запроса).
Потому что одним из преимуществ подготовленного оператора является: подготовка запроса выполняется только один раз (хотя оператор выполняется несколько раз)
Поэтому всякий раз, когда я вызываю эту функцию, она будет каждый раз подготавливать оператор, и это неправильно, потому что мы упустим одно из самых больших преимуществ Подготовленного оператора. Таким образом, я поставил Условие 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. В противном случае функция Выполните операцию с их приватная переменная, которая не работает должным образом