Mysqli – базово използване (част 2)

В това видео ще ви покажа, как да използвате prepared statemnts чрез mysqli, какви са предимствата, и как може леко да улесните взимането на резултатите.

5 мнения по „Mysqli – базово използване (част 2)

  1. Niki

    Благодаря за поредния ценен урок. Като един много начинаещ WEB програмист и човек, който не е писал код от 15 години, мога да кажа, че материала беше поднесен отлично щом аз го разбрах. Разбрах принципите и дори този начин го предпочитам, защото е по-четим. Дали заради липсата ми на опит, но ми се струва, че тук нещата ми изглеждат по подредени някак си. Дори ще си позволя да разсъждавам – малкия ми опит в ООП ми подсказва, че този начин е така, защото е по-удобен при програмиране по метода ООП. Мисля, че дори се досещам защо променливите се предават по референция, но може и да греша – ще го проверя.

    Още веднъж огромни благодарности!

  2. m1tk0

    това за референцията е доста интересно …до колкото разбрах предаването но референция на бинд резулт е необходимо за да може пхп да се ориентира къде да сложи данните .

    …нали в стандартна ситуация подаваните параметри са пойнтери към данните … а вече в тялото на функцията представляват копия на данните освен ако не са предадени по референция

  3. Борислав

    Ще се опитам да обясня защо функциите mysqli_stmt_bind_param и mysqli_stmt_bind_result са малко странни по отношение на параметрите си. Същото важи и за методите mysqli_stmt::bind_param и mysqli_stmt::bind_result.

    И двете функции приемат параметрите си по адрес (by reference). Ето как са дефинирани (копирам от документацията в http://php.net):

    * mysqli_stmt_bind_param ( mysqli_stmt $stmt , string $types , mixed &$var1 [, mixed &$... ] )
    * mysqli_stmt_bind_result ( mysqli_stmt $stmt , mixed &$var1 [, mixed &$... ] )

    Знака & преди името на променливата указва, че параметъра се предава по адрес, а не по стойност. С други думи, функцията получава адреса на променливата, вместо нейната стойност в момента на извикването на функцията. Най-важната последица от това е, че на тези функции могат да се предават само променливи:

    mysqli_stmt_bind_param($stmt, 'ss', $input_string1, $input_string2);
    mysqli_stmt_bind_result($stmt, $result_field1, $result_field2);

    Предаването на преки стойности е забранено и води до грешка:

    mysqli_stmt_bind_param($stmt, 'ss', 'input_string1', 'input_string2');
    mysqli_stmt_bind_result($stmt, 'result_field1', 'result_field2');

    Иван вече даде пример как предаването на пряка стойност на mysqli_stmt_bind_param води до грешка. Точно същия проблем възниква и ако използваме call_user_func_array, за да извикаме mysqli_stmt_bind_result:

    call_user_func_array(array($stmt, 'bind_result'), array($result_field1, $result_field2));

    Това дава грешка, защото call_user_func_array взема масива с променливите $result_field1 и $result_field2 и ги предава по стойност на метода $stmt->bind_result.

    Решението е да използваме масив с адресите на променливите:

    call_user_func_array(array($stmt, 'bind_result'), array(&$result_field1, &$result_field2));

    Това работи, защото call_user_func_array вика $stmt->bind_result с адресите на двете променливи и така те реално се предават по адрес. Това е и причината Иван да използва знака & примера си, за да предаде променливите по адрес, вместо по стойност.

    Има едно интересно следствие от това, че mysqli_stmt_bind_param приема параметрите си по адрес: стойностите на съответните променливи могат да се зададат и след извикването на mysqli_stmt_bind_param:

    mysqli_stmt_bind_param($stmt, 's', $input_string);
    $input_string = 'Буу!';
    mysqli_stmt_execute($stmt);

    Причината това да работи е, че стойностите на променливите, които се предават на mysqli_stmt_bind_param, се четат чак при извикването на mysqli_stmt_execute. Имайте все пак предвид, че ако нещо е възможно, не значи, че непременно е хубаво да се използва. 🙂

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *