Procedure, MySQL ve PHP

5 Cevap php

Soru oldukça açık biridir. Ben klasik ASP ve ASP.net ile bir süre MS SQLSunucusu ile Saklı Procs kullanarak ve onları seviyorum, çok oldum.

Ben PHP4 ve MySQL ile deneyim küçük bir miktar var, ve daha önce bu ile çalışırken sıralı SQL sınırlıydı.

Ben ve çeşitli nedenlerle için çalışıyorum küçük bir hobi proje LAMP yol gitti var.

MySQL ve depolanan yordamları kullanarak içine almak için herhangi bir ipuçları / hileler / tuzaklar veya iyi bir başlangıç ​​noktaları PHP5?

Evet MySQL Stored Procedures destekleyen benim sürümü böylece tuzak atlamak sağlar!

5 Cevap

Ben PHP5 olarak etiketlenmiş Bu yazı görüyorum, (değil için bir neden görmüyorum) BU PHP5 kullanarak sanki yanıtlamaya çalışacağım.

Forget about mysqli, it's buggy and should have been already removed.
Rather take a look at PDO, specifically Prepared statements and stored procedures

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

// call the stored procedure
$stmt->execute();

print "procedure returned $value\n";

@ Michal Kralik - ne yazık ki PDO demektir kullandığı MySQL C API ile bir hata var ki hata MySQL sonuçlar bazı sürümleri ile yukarıdaki gibi kod çalıştıran:

"Sözdizimi hatası veya erişim ihlali: 1414 OUT veya rutin $ bir yordamlar için INOUT argüman $ parameter_number bir değişken veya YENİ pseudo-değişken değildir".

Sen üzerinde hata raporunu görebilirsiniz bugs.mysql.com. Bu sürüm 5.5.3 + & için sabit oldu 6.0.8 +.

Sorunu gidermek için, size ayrı & gerekir Böyle sonucunu saklamak için dışarı parametreleri ve kullanımı kullanıcı değişkenleri:

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(:in_string, @out_string)");
$stmt->bindParam(':in_string', 'hello'); 

// call the stored procedure
$stmt->execute();

// fetch the output
$outputArray = $this->dbh->query("select @out_string")->fetch(PDO::FETCH_ASSOC);

print "procedure returned " . $outputArray['@out_string'] . "\n";

Saklı yordamları çağırmak için mysqli (MySQL Improved Extension) kullanmanız gerekir. Burada bir SP dediğimiz nasıl:

$ Mysqli = new MySQLi (kullanıcı, geçmek, db);

$ Result = $ mysqli-> sorgu ("ÇAĞRI sp_mysp ()");

When using SPs you'll need close first resultset or you'll receive an error. Here's some more information : http://blog.rvdavid.net/using-stored-procedures-mysqli-in-php-5/

: Alternatif olarak, çok düz ileri bulabilirsiniz Hazırlanan Tablolar, kullanabilirsiniz

$ Deyim = $ mysqli-> ("? Ad = MyTable telefon SEÇ") hazırlamak;

$ Deyim-> bind_param ("s", $ myName);

$ Deyim-> execute ();

MySQLi Dokümantasyon: http://no.php.net/manual/en/book.mysqli.php

Bu MySQL 5 saklı yordamları çağırmak için mysqli veya PDO kullanmak aslında zorunlu değildir. Siz eski mysql_ fonksiyonları ile sadece ince onları arayabilirsiniz. Yapamayacağınız tek şey birden çok sonuç kümeleri döndüren olduğunu.

Ben birden çok sonuç kümesi döndüren zaten eğilimli biraz hata olduğunu tespit ettik; bazı durumlarda çalışır ancak uygulama, hepsini tüketmek için hatırlar ancak aksi takdirde bağlantı kırık bir durumda kalır.

I have been using ADODB, which is a great thing for abstracting actual commands to make it portable between different SQL Servers (ie mysql to mssql). However, Stored procedures do not appear to be directly supported. What this means, is that I have run a SQL query as if it is a normal one, but to "call" the SP. An example query:

$query = "Call HeatMatchInsert('$mMatch', '$mOpponent', '$mDate', $mPlayers, $mRound,  '$mMap', '$mServer', '$mPassword', '$mGame', $mSeason, $mMatchType)";

Bu önemli olan, dönen veri için muhasebe değil. Ben değişken @ dönüş olarak kendiniz seçebilirsiniz ki, bu bir @ Var ayarı yapılabilir olacağını tahmin ediyorum.

Değişiklikler nedeniyle ayrılık yapmak çok kolay - onun yapılır sonra prosedür tabanlı web uygulaması saklanan bir ilk php (mssql çok iyi belgelenmiştir, bu değildir) etrafında çalışmak çok zordu yapma rağmen, olsa Özet olmak, harika.