Чи можна змішувати API MySQL в 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разом? Або це нормально? Чи я можу перевірити, чи підключення взагалі дійсні? (the if(mysq...))


5
mysql застарілий, це має сенс, що вони не працюватимуть разом. Чому ти намагаєшся це зробити?
Стерлінг Арчер

7
Вам слід уникати використання mysql_*функцій взагалі. Вони схильні до помилок і небезпечні, і незабаром їх буде видалено з PHP ( на даний момент вони позначені як застарілі ). [Ця чудова відповідь] [0] детальніше пояснює, чому вони погані. [0]: stackoverflow.com/a/12860046/1055295
Андрій Барсан

2
1) ви наполягаєте на тому, щоб використовувати старий сором'язливий інтерфейс (mysql), який у документі позначений як застарілий з еонів 2) з якоїсь дивної причини ви хочете змішати його зі своїм наступником, а не робити правильну справу та перетворити на новий 3 ) ви настільки здивовані, що це не працює, що ви запитуєте про це про це, хоча має бути досить очевидно, що те, що ви робите, - це нісенітниця.
fvu

1
Це не забобони. Звичайно, ви можете написати поганий код з mysqli_*функціями та хороший код з mysql_*ними. Але остання категорія позначена як застаріла, оскільки вона є неповноцінним набором функцій, не в змозі підтримувати виклики у стилі OO або навіть підготовлені заяви (назвати лише два приклади). З огляду на вибір двох інструментів для виконання однієї і тієї ж роботи, один з яких явно кращий у довгостроковій перспективі та гнучкіший, чи не очевидна правильна відповідь?
Андрій Барсан

1
Звичайно, ні. Однак, враховуючи можливість вибору між застарілою функціональністю та активно підтримуваною для, скажімо, прокатки власної абстракції, навіщо використовувати старі функції?
Андрій Барсан

Відповіді:


65

Ні, ви не можете використовувати mysqlі mysqliразом. Вони є окремими API, і створені ними ресурси несумісні між собою.

Однак є mysqli_close.


Хоча вам ніколи не потрібно буде закривати з'єднання; об'єкти прибирають, коли на них більше ніде не посилаються. (Не впевнений, чи роблять це звичайні старі ресурси, але об'єкти насправді можуть скористатись RAII в незначній мірі.)
cHao

@cHao не тільки це, але і PHP закриє будь-які відкриті підключення MySQL, коли сценарій завершиться
Explosion Pills

1
Але не завжди, на мій досвід, тому ми завжди розміщуємо закриття внизу файлу.
RationalRabbit

14

Просто, щоб дати тут загальну відповідь про всі три API MYSQL з посиланням:

Ви не можете змішувати будь-який з трьох ( mysql_*, mysqli_*, PDO) MYSQL API, з PHP разом, це просто не працює. Навіть у посібнику FAQ :

Це неможливо змішувати розширення . Так, наприклад, передача з'єднання mysqli до PDO_MySQL або ext / mysql не буде працювати .


Вам потрібно використовувати той самий API MySQL та пов'язані з ним функції, від підключення до запиту.


Хтось хлопець намагався сказати мені сьогодні, що у них немає проблем / помилок при змішуванні mysql_real_escape_string()з тим, що решта їхнього коду є PDO. Чи є щось, чого я не потрапив сюди свого часу, працюючи з цими різними API? Я тут невіглас? Це питання щодо "тепер видаленого" питання stackoverflow.com/q/34209127, який може бачити лише 10K + учасників, якщо хтось задумається. Це стосовно $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Чи я щось тут пропускаю?
Funk Forty Niner

1
@ Fred-ii- Ви маєте рацію :) Читання інструкції показує, що ви праві . Що , ймовірно , сталося те, що mysql_real_escape_string()буде мовчки намагатися встановити з'єднання з параметрами за замовчуванням , які потім працювали на OP. Так що це просто з'єднання, щоб отримати набір символів. Тож у ОП є 2 з'єднання
Rizier123

Якби ОП хоча б сказала мені / нам, що вони, ймовірно, мають 2 окремі зв’язки, я б, мабуть, погодився; вони вирішили інакше. Однак я все ще не можу зрозуміти, як це все-таки буде працювати. Якщо це так, я збита з пантелику.
Funk Forty Niner

@ Fred-ii- Див.: Link_identifier Він використовуватиме параметри з'єднання за замовчуванням, з якими він отримує ini_get(). Тож це, ймовірно, просто працює для ОП із налаштуваннями за замовчуванням. Я просто покину його і отримаю нову каву (☕☕☕).
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.