Вашата проверка, ако връзката е неуспешна, попада в кода, който използва връзката. Очевидно това няма да работи, защото не е жива връзка. Уверете се, че ако връзката не успее, кодът, който зависи от нея, не е достигнат. (Обърнете внимание, че не е необходимо да препоръчвам използването на exit или die. Те могат да доведат до доста лошо потребителско изживяване. Те могат да бъдат полезни, но в идеалния случай трябва да изведете по-добро съобщение и да оставите грозните неща за грешки за регистрационните файлове [освен ако не сте повторно тестване или това е скрипт от команден ред]).
Що се отнася до close() (който всъщност е псевдоним за free()):
free() основно освобождава всички неща, прикачени към резултата. Трябва да разберете, че има два (опростяване, но с него) начина за извличане на редове:
Buffered - Всичко се грабва наведнъж. С други думи, когато започнете да преглеждате записите, те всъщност вече са в паметта. Те са буферирани . Те не се изтеглят от сървъра всеки път, когато извикате fetch(), а по-скоро се изтеглят от паметта.
Небуфериран – може да има малък буфер, но по същество всеки път, когато извикате fetch(), PHP трябва да изтегли нов ред от базата данни. В началото на цикъла те не всички се намират в паметта.
Интересна забележка:num_rows() може да се извика при буферирана заявка много ефективно, тъй като всички редове вече са изтеглени (въпреки че никога не трябва да изтегляте всички редове само за да ги преброите - за това е COUNT). Небуферираните заявки не могат да правят num_rows(), докато не изтеглят всички редове. Това означава, че или ще бъде грешка, или по същество ще я превърне в буферирана заявка.
Както и да е, да се върнем към действителния ви въпрос:
free() освобождава всичко, свързано с резултатния обект. В случай на буферирана заявка, това са всички редове, които се намират в паметта. В случай на небуферирана заявка, free() ще освободи всички редове, които може да се намират в паметта, и след това ще отмени останалата част от заявката. По същество PHP казва на MySQL:"Хей, знаеш ли всички тези редове, които искам? Промених решението си. Можете просто да откажете тази заявка."
Що се отнася до това, ако трябва да освободите резултати... Е, когато променливата излезе извън обхвата*, това все пак ще се случи. Въпреки това, няма нищо лошо да го направите изрично и в ситуации, в които една заявка може да използва много памет, а след това друга заявка, след като може да използва много памет, може да искате да освободите наборите, само за да поддържате използването на памет ниско .
* Или може би когато заявката приключи. Не си спомням от главата си.