Почему существует mysqli_query, когда нужны подготовленные операторы?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Почему существует mysqli_query, когда нужны подготовленные операторы?

Сообщение Anonymous »

Я вообще не совсем понимаю, что такое подготовка и запрос в mysqli.

Этот экземпляр использует mysqli::query для обработки запроса, и известно, что он недостаточно защищен:

Код: Выделить всё

public function fetch_assoc($query)
{
$result = parent::query($query);
//$result = self::preparedStatement($query);
if($result)
{
return $result->fetch_assoc();
}
else
{
# call the get_error function
return self::get_error();
# or:
# return $this->get_error();
}
}
это тот, у которого есть подготовка-связывание-выполнение, который, как я полагаю, имеет лучшую безопасность,

Код: Выделить всё

public function fetch_assoc_stmt($sql,$types = null,$params = null)
{
# create a prepared statement
$stmt = parent::prepare($sql);

# bind parameters for markers
# but this is not dynamic enough...
//$stmt->bind_param("s", $parameter);

if($types&&$params)
{
$bind_names[] = $types;
for ($i=0; $iexecute();

# these lines of code below return one dimentional array, similar to mysqli::fetch_assoc()
$meta = $stmt->result_metadata();

while ($field = $meta->fetch_field()) {
$var = $field->name;
$$var = null;
$parameters[$field->name] = &$$var;
}

call_user_func_array(array($stmt, 'bind_result'), $parameters);

while($stmt->fetch())
{
return $parameters;
}

# close statement
$stmt->close();
}
Однако оба этих метода возвращают один и тот же результат:

Код: Выделить всё

$mysqli = new database(DB_HOST,DB_USER,DB_PASS,DB_NAME);

$sql = "
SELECT *
FROM root_contacts_cfm
ORDER BY cnt_id DESC
";
print_r($mysqli->fetch_assoc_stmt($sql));

print_r($mysqli->fetch_assoc($sql));
они печатают это:

Код: Выделить всё

Array
(
[cnt_id] => 2
[cnt_email1] => lau@xx.net
[cnt_email2] =>
[cnt_fullname] => Lau T
[cnt_firstname] => Thiam
[cnt_lastname] => Lau
[cnt_organisation] =>
[cnt_website] =>
[cnt_biography] =>
[cnt_gender] =>
[cnt_birthday] =>
[cnt_address] =>
[cnt_postcode] =>
[cnt_telephone] =>
[cnt_note] =>
[cnt_key] =>
[cat_id] =>
[tcc_id] =>
[cnt_suspended] => 0
[cnt_created] => 2011-02-04 00:00:00
[cnt_updated] => 2011-02-04 13:54:36
)
Array
(
[cnt_id] => 2
[cnt_email1] => lau@xx.net
[cnt_email2] =>
[cnt_fullname] => Lau T
[cnt_firstname] => Thiam
[cnt_lastname] => Lau
[cnt_organisation] =>
[cnt_website] =>
[cnt_biography] =>
[cnt_gender] =>
[cnt_birthday] =>
[cnt_address] =>
[cnt_postcode] =>
[cnt_telephone] =>
[cnt_note] =>
[cnt_key] =>
[cat_id] =>
[tcc_id] =>
[cnt_suspended] => 0
[cnt_created] => 2011-02-04 00:00:00
[cnt_updated] => 2011-02-04 13:54:36
)
Вы должны были заметить, что внутри метода fetch_assoc_stmt я вообще не использую fetch_assoc. Вероятно, нет никаких шансов на его использование, поскольку подготовка использует другой способ возврата результата.

Итак, мой вопрос: поскольку использование подготовки лучше, чем запрос, почему fetch_assoc вообще должен существовать? Разве мы не должны просто забыть об этом или не следует ли объявить его устаревшим в php.net?? То же самое и с fetch_all — зачем вообще это нужно!??

Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/510 ... re-a-thing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»