Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Dwie procedury MySQL w PHP

msmafy 02 Lis 2013 15:15 933 6
  • #1 02 Lis 2013 15:15
    msmafy
    Poziom 5  

    Witam

    Od niedawna zacząłem pisanie w php i natrafiłem na problem.
    Otóż mam dwie poprawnie działające procedury w MySQL. Obie procedury zawierają zapytania select. Kiedy chce wywołać procedury jedna po drugiej w php to przy drugiej procedurze pojawia się problem:

    Cytat:
    mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in...
    Wynika z tego że procedura zwraca wartość null, ale to nie prawda.
    Kod w php wygląda mniej więcej tak:

    Cytat:
    $result = mysqli_query($con,"CALL p_pobierz_notatki($uzytkownik)");
    //wszystkie notatki
    while($row = mysqli_fetch_assoc($result)){
    echo $tytul;
    }
    mysqli_free_result($result);

    $result = mysqli_query($con,"CALL p_pobierz_komentarze($uzytkownik)");
    while($row = mysqli_fetch_assoc($result)){
    echo $row['tresc'];
    }
    mysqli_free_result($result);

    Dlaczego wykonuje się zawsze ta wcześniejsza procedura a przy następnej jest wyżej napisany błąd? Czy po wykonaniu procedury trzeba coś jeszcze dopisać?
    Z góry dzięki za pomoc!

    0 6
  • #3 03 Lis 2013 20:58
    msmafy
    Poziom 5  

    Dżyszla napisał:




    Ale o ile się nie mylę, to polecenie CALL wcale nie zwraca wyników. Musisz wykonać SELECT z procedury, jeśli ta coś zwraca.

    Nie rozumiem. W procedurach mam selecta, więc procedury zwracają wartości. Jeżeli wykonuje jedną procedurę to wykona się ona poprawnie. Jeżeli wykonuje jedną po drugiej to wykona się ta pierwsza wykonywana a z drugą jest problem.

    0
  • #5 03 Lis 2013 23:22
    msmafy
    Poziom 5  

    Pierwsza procedurka:

    Cytat:

    DELIMITER $$

    USE `p_portal`$$

    DROP PROCEDURE IF EXISTS `p_pobierz_komentarze`$$

    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_pobierz_komentarze`(id_profilu INTEGER)
    BEGIN
    SELECT
    b.*,
    a.id_uzytkownika AS id_uzytkownika,
    CONCAT(a.imie,' ',a.nazwisko) AS autor_komentarza
    FROM
    komentarze b
    JOIN
    uzytkownicy a
    ON a.id_uzytkownika = b.autor
    WHERE
    b.adresat = id_profilu
    AND b.autor != id_profilu
    ORDER BY DATA DESC
    LIMIT 5;
    END$$

    DELIMITER ;

    Druga procedurka:
    Cytat:

    DELIMITER $$

    USE `p_portal`$$

    DROP PROCEDURE IF EXISTS `p_pobierz_notatki`$$

    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_pobierz_notatki`(id_profilu INTEGER)
    BEGIN
    SELECT *
    FROM
    komentarze
    WHERE
    autor = id_profilu
    ORDER BY DATA DESC
    LIMIT 5;
    END$$

    DELIMITER ;

    Rozumiem, że to zwykłe SELECTY, ale ponieważ się uczę PHP chciałem się dowiedzieć jak wykorzystać procedury z MySQL. Po za tym czasami lepiej napisać jedną procedurę niż wykonywać kilka zapytań. Może ja źle piszę te procedury?

    0
  • #6 04 Lis 2013 09:08
    Dżyszla
    Poziom 42  

    A jaka wersja MySQL? Bo generalnie tam się nie da zrobić tak, jak chcesz.
    W innych bazach często wykorzystuje się po prostu konstrukcję SELECT * FROM procedure, zaś w samej procedurze np umieszcza SUSPEND. Niestety MySQL kuleje jeszcze pod tym względem.

    0
  • #7 04 Lis 2013 13:45
    msmafy
    Poziom 5  

    Jeżeli chodzi o MySQL to wersja: 5.6.11.
    Troche udało mi się rozwiązać mój problem, tzn. przed każdym wykonaniem call ponownie łącze się z bazą. Mój kod wygląda teraz mniej więcej tak:

    Cytat:

    $con = mysqli_connect("myhost","myuser","mypassw","mybd");
    ...
    jakieś zapytania MySQL
    ...
    $result = mysqli_query($con,"CALL p_pobierz_notatki($uzytkownik)");
    //wszystkie notatki
    while($row = mysqli_fetch_assoc($result)){
    echo $tytul;
    }
    mysqli_free_result($result);

    $con = mysqli_connect("myhost","myuser","mypassw","mybd");
    $result = mysqli_query($con,"CALL p_pobierz_komentarze($uzytkownik)");
    while($row = mysqli_fetch_assoc($result)){
    echo $row['tresc'];
    }
    mysqli_free_result($result);


    Nie wiem dlaczego, ale tak działa :D

    0