Могу ли я смешивать MySQL API с PHP?


106

Я искал в сети и пока что увидел, что вы можете использовать mysql_и mysqli_вместе, что означает:

<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");

if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysql_close($con);
echo "Done";
?>

или

<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysqli_close($con);
echo "Done";
?>

Действительны, но когда я использую этот код, я получаю следующее:

Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done

Для первого и того же кроме с mysqli_close(). Для второго.

В чем проблема? Разве нельзя использовать mysql_и mysqliвместе? Или это нормально? Могу ли я проверить, действительны ли вообще соединения? (в if(mysq...))


5
mysql устарел, имеет смысл только то, что они не будут работать вместе. Почему вы пытаетесь это сделать ..?
Sterling Archer

7
Вам следует mysql_*вообще избегать использования функций. Они подвержены ошибкам и небезопасны, и вскоре будут удалены из PHP ( на данный момент они помечены как устаревшие ). [Этот замечательный ответ] [0] более подробно объясняет, почему они плохие. [0]: stackoverflow.com/a/12860046/1055295
Андрей Бурсан 05

2
1) вы настаиваете на использовании старого дрянного интерфейса (mysql), который помечен в документе как устаревший с эпохи 2) по какой-то нечетной причине вы хотите смешать его с его преемником вместо того, чтобы делать правильные вещи и преобразовывать в новый 3 ) вы настолько удивлены, что это не работает, что вы спрашиваете об этом у SO, хотя должно быть довольно очевидно, что то, что вы делаете, - ерунда.
fvu 06

1
Это не суеверие. Конечно, вы можете писать плохой код с mysqli_*функциями, а хороший - с mysql_*ними. Но последняя категория помечена как устаревшая, поскольку это неполноценный набор функций, неспособный поддерживать вызовы в стиле объектно-ориентированного программирования или даже подготовленные операторы (это всего лишь два примера). Учитывая выбор из двух инструментов для выполнения одной и той же работы, один из которых явно лучше в долгосрочной перспективе и более гибкий, не очевиден ли правильный ответ?
Андрей Бурсан 06

1
Конечно нет. Однако, учитывая возможность выбора между устаревшей функциональностью и активно поддерживаемой, например, для развертывания собственной абстракции, зачем использовать старые функции?
Андрей Бурсан 06

Ответы:


66

Нет, нельзя использовать mysqlи mysqliвместе. Это отдельные API, и ресурсы, которые они создают, несовместимы друг с другом.

Существует mysqli_close, хотя.


Хотя в любом случае вам никогда не нужно закрывать соединение; объекты очищаются, когда на них больше нет ссылок. (Не уверен, что обычные старые ресурсы делают это, но объекты действительно могут использовать RAII в
немалой

@cHao не только это, но PHP закроет все открытые соединения MySQL при выходе из скрипта
Explosion Pills

1
Но не всегда, по моему опыту, поэтому мы всегда ставим закрытие в конце файла.
RationalRabbit

14

Просто чтобы дать здесь общий ответ обо всех трех API MYSQL со ссылкой:

Вы не можете смешивать любой из трех ( mysql_*, mysqli_*, PDO) MYSQL API, из PHP вместе, это просто не работает. Это даже в ручном FAQ :

Это не возможно смешивать расширения . Так, например, передача подключения mysqli к PDO_MySQL или ext / mysql не будет работать .


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


Какой-то парень пытался сказать мне сегодня, что у них нет проблем / ошибок при смешивании mysql_real_escape_string()с тем, что остальная часть их кода является PDO. Есть ли что-то, чего я не понял в свое время, работая с этими разными API? Я здесь невежественный? Это касается вопроса «теперь удален» stackoverflow.com/q/34209127, который могут просматривать только более 10 тыс. Участников, если кому-то интересно. Это в отношении $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Я что-то здесь упускаю?
Funk Forty Niner

1
@ Fred-ii - Вы правы :) Чтение инструкции показывает, что вы правы . Что, вероятно, произошло, это то, что он mysql_real_escape_string()будет молча попытаться установить соединение с параметрами по умолчанию, которые затем сработали для OP. Итак, он просто установил соединение, чтобы получить набор символов. Итак, OP имеет 2 соединения
Rizier123

Если бы OP хотя бы сказал мне / нам, что у них, вероятно, было 2 отдельных соединения, я бы, вероятно, согласился; они решили иначе. Однако я до сих пор не понимаю, как это будет работать. Если это так, я сбит с толку.
Funk Forty Niner

@ Fred-ii- См .: link_identifier. Он будет использовать настройки соединения по умолчанию, с которыми он получает ini_get(). Так что это, вероятно, просто работает для OP с настройками по умолчанию. Я бы просто оставил это и выпил нового кофе (☕☕☕).
Rizier123

Вы можете добавить что-нибудь о sqlsrv_query(). Я только что закрыл вопрос stackoverflow.com/q/41263771
Funk Forty Niner

2

Технически вы можете использовать столько отдельных подключений, сколько хотите, в то время как ваша проблема вызвана простой опечаткой - вы не можете использовать ресурсы одного расширения с функциями другого, что совершенно очевидно.

Однако вам следует избегать множественных подключений из одного и того же скрипта , независимо от того, из одного API или из разных. Поскольку это будет обременять ваш сервер базы данных и истощать его ресурсы. Таким образом, хотя технически это возможно, вам не следует смешивать в коде разные расширения, за исключением короткого периода рефакторинга.


Хотя это, наверное, хорошая идея, но по этой причине был разработан пул соединений. Когда у вас есть несколько веб-запросов, попадающих на веб-сервер, вы не можете легко использовать одно и то же соединение, поэтому вы открываете новое соединение. Пул соединений сокращает накладные расходы на сервер приложений и базу данных.
Дуг

-3

MySQLiнамного безопаснее, чем тот, MySQLкоторый в любом случае устарел. Вот почему вы должны придерживаться, MySQLiа также вы не можете смешивать их, поскольку они оба разные.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.