Procedury MySQL a PHP

0

Witam
Proszę o jakiś link do kursu gdzie w przystępny sposób (najlepiej lopatologiczny) jest śnione tworzenie procedury w MySQL i ich wykorzystanie w PHP.
Przeszukałem Google w tym kierunku i nie znalazłem nic intersującego, same wypociny jakichś osób, które same piszę, że nie wiedzą czy dobrze piszą bo się dopiero uczą, albo zamiast procedur są funkcje :/

Jeśli nie znacie linku do takiego kursu, a sami potraficie mi to w jakiś przystępny sposób wyjaśnić, to będę wdzięczny. Chodzi głównie o tworzenie procedury, a następnie zastosowanie jej w PHP do konkretnego celu.

0

No dzięki z tego co jest wiem jak zrobić procedurę, ale jak ją wywołać w PHP i doszyć do tego zmienne z formularza, to już nie wiem ^^

EDIT:
To może zapytam inaczej :D Mam taką oto sobie procedurę:

CREATE PROCEDURE dodaj_klienta (IN pr_imie CHAR(10), IN pr_nazwisko CHAR(20), IN pr_pesel CHAR(11), IN pr_telefon 
CHAR(10), IN pr_miasto CHAR(25), IN pr_kod_pocztowy INT(5), IN pr_ulica CHAR(20), IN pr_admin INT(1), IN pr_haslo 
CHAR(11), IN pr_stan_konta FLOAT(10,2))
BEGIN
DECLARE m1 INT;
DECLARE m2 INT;
DECLARE m3 BIGINT;
DECLARE i1 INT;
DECLARE i2 INT;
SET m1=(SELECT MAX(Id_klienta) FROM Klienci);
SET m2=(SELECT MAX(Id_konta) FROM Konta);
SET m3=(SELECT RAND() * 10000000000);
SET i1=m1+1;
SET i2=m2+1;
INSERT INTO Klienci VALUES (i1, pr_imie, pr_nazwisko, pr_pesel, pr_telefon, pr_miasto, pr_kod_pocztowy, pr_ulica, 
pr_admin);
INSERT INTO Konta VALUES (i2, m3, pr_haslo, i1, pr_stan_konta);
END; 

I takie wywołanie:

call dodaj_klienta ('Jan','Kowalski','87564534291','6875635423','Czestochowa',42200,'Chopina 5',2,'haslo3',12.47);

Tak by to wyglądało w samym SQL, a jak się sprawa ma z PHP? Mam formularz i muszę przesłać z niego informacje do procedury. Mam to zrobić tak jak ze zwykłym PHP? Próbowałem podstawić zmienne, ale nic z tego nie wyszło. Wie ktoś jak to ubrać w PHP, żeby mozna było wstawić pod submita?

0

I jak, wie ktoś w jaki sposób wywołać procedurę MySQL w PHP?

0

mysql_query( "CALL procedure($param)" );

0

Adam nie wiem czy cię dobrze zrozumiałem bo zrobiłem jak napisałeś i nie działa :/

Może zapodam kod.
To jest formularz:

<form action="add_user.php" method="post">

Imię: <input type=text name=imie maxlength=10 size=11><br><br>
Nazwisko: <input type=text name=nazwisko maxlength=20 size=21><br><br>
PESEL: <input type=text name=pesel maxlength=11 size=12><br><br> 
Telefon: <input type=text name=telefon maxlength=10 size=11><br><br>
Miasto: <input type=text name=miasto maxlength=25 size=26><br><br>
Kod pocztowy: <input type=text name=kod_pocztowy maxlength=6 size=7><br><br>
Ulica: <input type=text name=ulica maxlength=20 size=21><br><br>
Hasło: <input type=text name=haslo maxlength=11 size=12><br><br>
Stan konta: <input type=text name=stan_konta maxlength=12 size=13><br><br>
<input type=submit value="Dodaj klienta">
</form>

A to skrypt:

<?
if (!$imie || !$nazwisko || !$pesel || !$telefon || !$miasto || !$kod_pocztowy || !$ulica)

 {
	print "Nie zostały wypełnione wszystkie pola";
	exit;
 }

$imie = addslashes($imie);  
$nazwisko = addslashes($nazwisko);
$pesel = addslashes($pesel);
$telefon = addslashes($telefon);
$miasto = addslashes($miasto);
$kod_pocztowy = addslashes($kod_pocztowy);
$ulica = addslashes($ulica);
$haslo = addslashes($haslo);
$stan_Konta = addslashes($stan_konta);


//srand(time());
//$id_konta=rand();
@$db = mysql_pconnect("localhost", "root", "krasnal");
if (!$db)  
	{  
	print "Nie można nawiązać połączenia z bazą danych";
	exit;
	}

mysql_select_db("db66705");
//mysql_query( "CALL procedure($param)" );
$query = mysql_query("CALL dodaj_klienta ('$imie','$nazwisko','$pesel','$telefon','$miasto','$kod_pocztowy','$ulica','NIE','$haslo','$stan_konta'))"; 
//INSERT INTO klienci (Imie, Nazwisko, PESEL, Telefon, Miasto, Kod_pocztowy, Ulica, Admin) VALUES ('$imie',
//'$nazwisko','$pesel','$telefon','$miasto','$kod_pocztowy','$ulica','NIE')";
$result = mysql_query($query);

if ($result)
print "Klient <b>".$imie."</b> został dodany do bazy danych.";
else { print "W bazie istnieje już klient o tym samym numerze PESEL."; }

?>

Nie wyrzuca błędu, ani nic w tym rodzaju, ale też nie dodaje nowego rekordu :/
Szukałem na necie czegoś o wywoływaniu procedur w PHP, ale ten temat jest ubogi jak mało który :/

0

W wywołaniu procki na końcu masz dwa nawiasy. Wywołanie procki poza tym nawiasem jest zrobione prawidłowo i analogiczne wywołanie u mnie świetnie działa.

Poza tym te $result = mysql_query($query); to co robi w kodzie? Tak w ogóle to sprawdź sobie czy połączenie z bazą jest ok i czy zwykłe inserty śmigają. Jak nadal nie będzie działać to pokaż kod procki.

0

Ale głupi błąd^^ Poprawiłem, wywaliłem $result = mysql_query($query); i ładnie śmiga :) Dzięki za pomoc Adam, sam pewnie ze 4 dni jeszcze bym się męczył :/

EDIT:
Pośpieszyłem sie jednak :) Procedura ładnie działa, ale formularz nie przesyła zmiennych :/

Formularz:

<form action="add_user.php" method="post">

Imię: <input type=text name=imie maxlength=10 size=11><br><br>
Nazwisko: <input type=text name=nazwisko maxlength=20 size=21><br><br>
PESEL: <input type=text name=pesel maxlength=11 size=12><br><br> 
Telefon: <input type=text name=telefon maxlength=10 size=11><br><br>
Miasto: <input type=text name=miasto maxlength=25 size=26><br><br>
Kod pocztowy: <input type=text name=kod_pocztowy maxlength=6 size=7><br><br>
Ulica: <input type=text name=ulica maxlength=20 size=21><br><br>
Hasło: <input type=text name=haslo maxlength=11 size=12><br><br>
Stan konta: <input type=text name=stan_konta maxlength=12 size=13><br><br>
<input type=submit value="Dodaj klienta">
</form>

Plik add_user.php zamieszczałem wcześniej. Nie mam pojęcia dlaczego tak się dziele, ale ewidentnie zmienne nie są przesyłane.

0

Obsługa formularzy jest dosyć ładnie opisana pod tym linkiem: http://www.internetmaker.pl/artykul/2925,1,obsluga_formularzy.html

0

Przeczytane, wnioski wyciągnięte, błąd naprawiony :)
Dzięki za pomoc i link, bardzo ciekawa strona.

0

Ech i znowu mam problem :/

Mam taki kod w index:

<?
ob_start();
    require_once('./config.php'); // załaczamy plik config.php

    function usun($data){
    
        GLOBAL $dbc;
      if (ini_get('magic_quotes_gpc')){
        $data = stripslashes($data);
      }
       return mysql_real_escape_string($data, $dbc);
    }
        
        if (isset($_POST['submit'])){
    
    if (empty($_POST['login'])){
        $message .= '<font class="blad">Nie podałeś loginu</font><br />';
        $l = FALSE;
    }else{
        $l = usun($_POST['login']);
    }
        
    if (empty($_POST['haslo'])){
        $message .= '<font class="blad">Nie podałeś hasła</font><br />';
        $h = FALSE;
    }else{
        $h = usun($_POST['haslo']);
    }
        
        if ( $l && $h ){
    
    $query1 = "SELECT Konta.Id_konta, Konta.Haslo, Klienci.Admin FROM Klienci, Konta WHERE Konta.Id_konta = '$l' AND Konta.Haslo = '$h' AND Klienci.Admin = 'TAK' GROUP BY Konta.Id_konta";
    $result1 = mysql_query($query1);
        $row1 = mysql_fetch_array ($result1, MYSQL_ASSOC);
                
    $query2 = "SELECT Konta.Id_konta, Konta.Haslo, Klienci.Admin FROM Klienci, Konta WHERE Konta.Id_konta = '$l' AND Konta.Haslo = '$h' AND Klienci.Admin = 'NIE' GROUP BY Konta.Id_konta";
    $result2 = mysql_query($query2);
        $row2 = mysql_fetch_array ($result2, MYSQL_ASSOC);
                
                
                if($row1){
    session_start();
	
	mysql_select_db("db66705");
$query=mysql_query("call logowanie ('$l')");

        $_SESSION['username'] = $row['username'];
                $_SESSION['haslo'] = $row['haslo'];
        $_GET['cmd'] = 'ok';
        header ("Location: admin.php?cmd={$_GET['cmd']}");  // przekierowuje nas na jaka strone chcemy
    }
	else if ($row2)
        {
         session_start();
		 
		 mysql_select_db("db66705");
$query=mysql_query("call logowanie ('$l')");

        $_SESSION['username'] = $row2['username'];
                $_SESSION['haslo'] = $row2['haslo'];
        $_GET['cmd'] = 'ok';
        header ("Location: menu.php?cmd={$_GET['cmd']}");  // przekierowuje nas na jaka strone chcemy
        
        }
        else
        
        {
        $message .= '<font class="blad">Błędne hasło lub login</font><br />';
    }
	
mysql_close();
}else{
    $message .= '<font class="blad">Spróbuj jeszcze raz</font>';
}
}
ob_end_flush();
?>


<form method="post" action="<? echo $_SERVER['PHP_SELF']; ?>">
    <table align="center" border="0">
        <tr>
            <td align="right" class="uni_01">Login:</td>
            <td><input type="text" name="login" size="30"></td>
        </tr>
        <tr>
            <td align="right" class="uni_01">Hasło:</td>
            <td><input type="text" name="haslo" size="30"></td>
        </tr>
        <tr>
            <td align="right" class="uni_01"> </td>
            <td>
        <p align="center"><input style="font-weight: bold;" type="submit" name="submit" value="loguj">
        </td></tr>
    </table>
</form>


<div align="center">
<? if(isset($message)){
    echo $message;
   }
?>
</div>

Problem polega na tym, że za każdym razem przekierowuje mnie na podstronę przeznaczoną dla admina (admin.php) nawet jeśli wypełniłem pola danymi, które kwalifikują się do warunku z przeniesieniem na stronę użytkownika (menu.php).
Sprawdzałem to na kilkanaście sposobów i wyszło mi, że dane z bazy i formularza są dobrze przekazywane.
Widzi ktoś w którym miejscu się walnąłem?

0

A może tak mógłbyś zainstalować sobie eclipse + zenddebugger ?

0

Wygląda na to, że row1 jest true.

0
b0bik napisał(a)

A może tak mógłbyś zainstalować sobie eclipse + zenddebugger ?

Pierwszy raz słyszę? Myślisz, że mi pomoże (raczej zielony w te klocki jestem).

Adam no tak, row1 jest true, ale problem polega na tym że on zawsze jest true, nawet gdy nie powinien. Myślę, że błąd tkwi w zapytaniu do bazy danych (łączenie tabel) bo niby w sql zapytanie jest prawidłowe i wybiera zawsze poprawny rekord, ale w php już chyba to nie funkcjonuje :/

0

Po wielu próbach wiem co jest źle ^^ Ale nie wiem jak to naprawić :)
Wiem na pewno że złączenie nie działa :/ Gdy na twardo podpisze zmienne, to działa dobrze. Albo gdy wszystkie rekordy są w 1 tabeli też jest oki, niestety przy złączeniu 2 tabel nie działa.
Sprawdzałem kilka typów zlączeń i nic, w SQL śmiga, a w PHP nie :/

0

Jeżeli działa w SQL-u i nie chcesz rozgryzać dlaczego nie działa w PHP to wsadź logowanie do procedury i w procedurze wykonuj zapytanie oraz zwracaj true albo false.

1 użytkowników online, w tym zalogowanych: 0, gości: 1