konto usunięte

Temat: MySQL procedura + PHP

Witam. Dopiero zaczynam przygodę z PHP i MySQLem do tej pory zajmowałem się technologiami MicroSoftu (ASP .NET /C#) itd. Chcę zrobić swój serwis WWW ale technologie MicroSoftu są tu raczej nie wskazane ;)
Jako początkujący developer w tych technologiach mam pewien problem i nie wiem co robię źle a na sieci rozwiązania nie sprawdzają się u mnie. Otóż potrzebuję uruchomić z kodu PHP procedurkę MySQL. Nie wiem czy dobrze napisałem procedurę:

create procedure Test(in param1 varchar(32), in param2 varchar(32), out error int)
begin
update tabela set kolumna=wartosc where kolumna2=wartosc2
error=0
end

chciałbym również żeby procedurka zwróciła mi ilość rekordów które uaktualniła. W MS SQL był parametr jak @@rowcount a czy tu jest coś podobnego?? Czy musze najpierw zrobić SELECTa i przechować ilość rekordów jakie mi zwróci??
No i prosiłbym o przykład kodu w PHPie jak wywołać taka procedurką. Z góry dzięki za pomoc :)

konto usunięte

Temat: MySQL procedura + PHP

Musisz załadować procedurę do MySQL za pomocą konsoli lub np. phpmyadmin. Następnie w php


mysql_query("Test(p1, p2)");

konto usunięte

Temat: MySQL procedura + PHP

Dzięki, zaraz sprawdzę :) aha właśnie jeszcze jedno pytanie :) Jak mogę podejrzeć wnętrze procedury? jakiś desc Procedura ?
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: MySQL procedura + PHP

Funkcja mysql_affected_rows() zwraca liczbę rekordów uaktualnionych poprzednim zapytaniem (lub -1 jeśli zapytanie zawiedzie). Więc zmienna error będzie niepotrzebna.
Poza tym - masz inne nazwy parametrów :)

A w PHP:

<?
$query = mysql_query('CALL Test(\'wartosc1\', \'wartosc2\')');
$rows = mysql_affected_rows();
?>
albo, jeśli zmiennymi:
<?
$query = mysql_query("CALL Test('$wartosc1', '$wartosc2')");
$rows = mysql_affected_rows();
?>

Podejrzeć można w phpMyAdminie (pod tabelami jest lista funkcji i procedur).Maciej Niedźwiecki edytował(a) ten post dnia 25.05.09 o godzinie 10:30

konto usunięte

Temat: MySQL procedura + PHP

Podejrzeć można w phpMyAdminie (pod tabelami jest lista funkcji

właśnie w serwisie yoyo.pl jakoś nie ma wyświetlonych procedur pod tabelami :/
Dominik Stelmach

Dominik Stelmach Programista
Aplikacji
Internetowych,
Action S.A.

Temat: MySQL procedura + PHP

Jeżeli masz pełen dostęp do serwera to możesz użyć narzędzia do administracji MySQL dostępnego na stronie mysql.com:

MySQL Administrator

Możesz również podejrzeć kod:
używając SHOW PROCEDURE CODE

http://dev.mysql.com/doc/refman/5.0/en/show-procedure-...

Oczywiście przy tworzeniu procedury nie zapomnij o DELIMITER. Ale to zapewne wiesz :)

Pozdrawiam,
Dominik

konto usunięte

Temat: MySQL procedura + PHP

oki chyba nie ma błędów ale procedurka się nie uruchamia przez www natomiast jak uruchomię w phmyadmin to działa. Sprawdzałem podmieniając string wywołania procedury na zwykłego selecta który się wykonuje bez problemów. O co kaman ??
CALL Test ('p1', 'p2');
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: MySQL procedura + PHP

Może daj tak:
mysql_query('CALL Test(\'p1\', \'p2\')') or die (mysql_error());

i napisz jaki wywaliło błąd.

Paweł Kaszperuk:
>
właśnie w serwisie yoyo.pl jakoś nie ma wyświetlonych procedur pod tabelami :/

W starszych wersjach phpMyAdmina procedury nie są uwzględniane. Od której wersji są, to nie wiem, na pewno w 2.5.6 nie ma a 2.11.4 są.
Jeśli na serwerze jest starsza wersja pMA, to można spróbować zainstalować sobie nowszą na swoim koncie (kwestia wpisania swoich parametrów w config.inc.php).Maciej Niedźwiecki edytował(a) ten post dnia 25.05.09 o godzinie 15:05

konto usunięte

Temat: MySQL procedura + PHP

właśnie sprawdzałem coś do WHERE'a musi iść źle bo nie wynajduje mi rekordów...

zapytanie dokładnie wyświetlam na stronie i ma postać:
CALL ActivateAccount ('aaa', '\'bbb\'');

czy to znaczy że php dorzuca \ i później w where mi szuka razem z \ ?? coś tu źle tworzę stringa do zapytania ;/

$query=mysql_query("CALL test ('aaa', '$bbb');") or die(mysql_error());
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: MySQL procedura + PHP

To może masz w konfiguracji włączone jakieś magic_quotes albo coś.
Spróbuj innej składni, tylko na pojedynczych cudzysłowach (zakładam, że zmienna $bbb to string i że do procedury zapodajesz 2 stringi):

$query = mysql_query('CALL ActivateAccount(\'aaa\',\''.$bbb.'\')') or die(mysql_error());

no i zakładam, że podstawienie wartości pod $bbb jest mniej więcej takie:
$bbb = 'wartosc'; -> bo może tutaj dodajesz niepotrzebnie slashe.

BTW. Polecam taki skrypcik, co się zwie PHP Interactive (http://www.hping.org/phpinteractive/) - można bezpośrednio pisać i uruchamiać skrypty na stronie, co oszczędza trochę klikania jak się chce przetestować jakieś małe modyfikacje :)Maciej Niedźwiecki edytował(a) ten post dnia 25.05.09 o godzinie 16:41

konto usunięte

Temat: MySQL procedura + PHP

heh problem był jak zwykle w takich wypadkach prozaiczny... otóż jako parametr leciał string od razu z apostrofami...

Temat: MySQL procedura + PHP

to ja się podepnę do tematu, bo temat podobny :)

Otóż mam procedurę (poniżej fragment):

(...)
DECLARE duplicate_nick INT DEFAULT 0;
DECLARE duplicate_email INT DEFAULT 0;
DECLARE active_key VARCHAR(8) DEFAULT NULL;
(...)
select duplicate_email ,duplicate_nick, active_key;
(...)

wywołana procedura w MySQL Administrator zwraca 3 wartości (tak jak chciałem), a w PHP wyskakuje błąd. Używam PHP 5.2.9-1 i mySQL 5.1.32. Serwer WAMP do testów na Windows XP. Ponieważ nie jestem "zawodowcem" w tej dziedzinie i mam z tym problem, dlatego byłbym wdzięczny za podpowiedź jak przetwarzać w php wartości zwracane przez procedurę zawierającą "select". Czy chodzi może o wersję php i MySQL? A może jakieś MySQLi czy coś takiego?Daniel Ś. edytował(a) ten post dnia 25.05.09 o godzinie 19:31
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: MySQL procedura + PHP

Daniel Ś.:
to ja się podepnę do tematu, bo temat podobny :)

Otóż mam procedurę (poniżej fragment):

(...)
DECLARE duplicate_nick INT DEFAULT 0;
DECLARE duplicate_email INT DEFAULT 0;
DECLARE active_key VARCHAR(8) DEFAULT NULL;
(...)
select duplicate_email ,duplicate_nick, active_key;
(...)

wywołana procedura w MySQL Administrator zwraca 3 wartości (tak jak chciałem), a w PHP wyskakuje błąd. Używam PHP 5.2.9-1 i mySQL 5.1.32. Serwer WAMP do testów na Windows XP. Ponieważ nie jestem "zawodowcem" w tej dziedzinie i mam z tym problem, dlatego byłbym wdzięczny za podpowiedź jak przetwarzać w php wartości zwracane przez procedurę zawierającą "select". Czy chodzi może o wersję php i MySQL? A może jakieś MySQLi czy coś takiego?Daniel Ś. edytował(a) ten post dnia 25.05.09 o godzinie 19:31

Wygląda na to, że jeśli mają być zwrócone wartości, to trzeba stosować funkcje. Procedury tylko dla zapytań INSERT, UPDATE, DELETE itp.
Chociaż z dokumentacji MySQL wynika, że powinno działać... i z linii poleceń faktycznie działa. Nie wiem jak to obejść :(
No i nie za bardzo mi się udaje zdefiniować funkcję, która zwraca tabelę :(

konto usunięte

Temat: MySQL procedura + PHP

A czy możecie mi jeszcze podpowiedzieć jak np mógłbym oznaczać każdą stronę w systemie? Chodzi o to żeby każda miała jakiś unikatowy identyfikator np po to żeby można było podczas wczytania jakimś uniwersalnym skryptem (klasą) pobrać jakieś wartości z bazy w zależności od id strony. Myślałem nad jakimiś hiddenami lub zmiennymi ale chciałbym poznać Waszą opinię ;]
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: MySQL procedura + PHP

Paweł Kaszperuk:
A czy możecie mi jeszcze podpowiedzieć jak np mógłbym oznaczać każdą stronę w systemie? Chodzi o to żeby każda miała jakiś unikatowy identyfikator np po to żeby można było podczas wczytania jakimś uniwersalnym skryptem (klasą) pobrać jakieś wartości z bazy w zależności od id strony. Myślałem nad jakimiś hiddenami lub zmiennymi ale chciałbym poznać Waszą opinię ;]

Rozwiązań jest pewnie tyle, ilu programistów ;)
Można ustawiać zmienną:
$page_name = 'login';
Można definiować stałą:
define('PAGE_NAME', 'login');
Można to sobie wyciągać ze zmiennych systemowych (np. $_SERVER['SCRIPT_NAME']).
Jakub Kozak

Jakub Kozak www.smultron.pl

Temat: MySQL procedura + PHP

Paweł Kaszperuk:
A czy możecie mi jeszcze podpowiedzieć jak np mógłbym oznaczać każdą stronę w systemie? Chodzi o to żeby każda miała jakiś unikatowy identyfikator np po to żeby można było podczas wczytania jakimś uniwersalnym skryptem (klasą) pobrać jakieś wartości z bazy w zależności od id strony. Myślałem nad jakimiś hiddenami lub zmiennymi ale chciałbym poznać Waszą opinię ;]

Zależy co Ci dokładnie chodzi.
Jeżeli masz np. 5 podstron tekstowych i na każdej chcesz wyświetlić inny tekst z bazy to możesz stworzyć sobie funkcję pobierz_tekst($id) i na każdej podstronie robić np.

echo pobierz_tekst(3);
// albo dodać pole "nazwa" w tabeli i bardziej uniwersalnie:
echo pobierz_tekst('nazwatekstu');

Możesz też przekazywać parametr w url'u: index.php?tekst=3

echo pobierz_tekst($_GET['tekst']);

Nie zapomnij tylko o filtrowaniu parametrów przychodzących z zewnątrz. Natomiast idea "nazywania" każdej strony w systemie chyba nie do końca jest stosowana w PHP. Link na stronie kieruje do konkretnego pliku który wyświetla to, co w tym pliku sobie pobierzesz z bazy. Link może mieć też parametry, które dostarczają dodatkowych informacji. I tyle.

konto usunięte

Temat: MySQL procedura + PHP

Maciej Niedźwiecki:
>
Wygląda na to, że jeśli mają być zwrócone wartości, to trzeba stosować funkcje. Procedury tylko dla zapytań INSERT, UPDATE, DELETE itp.

Bzdury ... ja używam tylko procedur w moich aplikacjach.

Mała podpowiedź (mysqli)



public function query($query)
{
$this->_connect();

(...)

$mysqliMultiResult = mysqli_multi_query(
self::$_db,
$query
);
if (mysqli_errno(self::$_db))
{
(...)

}
$index = 0;
if ($mysqliMultiResult)
{
do
{
if ($mysqliResult = mysqli_store_result(self::$_db))
{
while ($row = mysqli_fetch_array($mysqliResult, MYSQLI_ASSOC))
{
$dbResult[$index][] = $this->_prepareRow($row);
}
}
if (mysqli_more_results(self::$_db))
{
++$index;
}

}
while (mysqli_next_result(self::$_db));
}

if (!empty($dbResult))
{
if (sizeof($dbResult) <= 1 && key_exists(0, $dbResult))
{
$result = $dbResult[0];
}
else
{
$result = $dbResult;
}
}

(...)

return $result;
}

Stanisław Głogowski edytował(a) ten post dnia 28.05.09 o godzinie 19:25
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: MySQL procedura + PHP

Stanisław Głogowski:
Maciej Niedźwiecki:

Wygląda na to, że jeśli mają być zwrócone wartości, to trzeba stosować funkcje. Procedury tylko dla zapytań INSERT, UPDATE, DELETE itp.

Bzdury ... ja używam tylko procedur w moich aplikacjach.

Mała podpowiedź (mysqli)

No racja, bzdura :)
A więc prostuję - oczywiście, że można normalnie korzystać z procedur wbudowanych MySQL w aplikacjach PHP. Trzeba tylko posłać do serwera MySQL dodatkową flagę podczas połączenia:

mysql_connect('localhost', 'user', 'pass', false, 65536);

i już można bez przeszkód wyciągać rekordy z procedury:

$q = mysql_query('call myProcedure()') or die (mysql_error());
$r = mysql_fetch_row($q);
Maciej Niedźwiecki edytował(a) ten post dnia 29.05.09 o godzinie 13:33

konto usunięte

Temat: MySQL procedura + PHP

Maciej Niedźwiecki:

i już można bez przeszkód wyciągać rekordy z procedury

Przeszkodą mogą być dwa rezultaty zwracane przez procedurę.
I tu z pomocą idzie mysqli_multi_query.

konto usunięte

Temat: MySQL procedura + PHP

a co robi funkcja $this->_prepareRow($row);
??



Wyślij zaproszenie do