سؤال

السؤال هو إلى حد ما فتح أحد.لقد تم استخدام المخزنة Procs مع MS SQLServer لبعض الوقت مع ASP الكلاسيكية ، ASP.net و أحب لهم الكثير.

لدي هواية صغيرة مشروع أعمل عليه و لأسباب مختلفة قد ذهب مصباح الطريق.أي تلميحات/الحيل/الفخاخ أو نقطة انطلاق جيدة للوصول إلى استخدام الإجراءات المخزنة مع MySQL و PHP5?نسختي من الخلية يدعم الإجراءات المخزنة.

هل كانت مفيدة؟

المحلول

نسيان mysqli, الأمر أصعب في الاستخدام من شركة تنمية نفط عمان و يجب إزالتها بالفعل.صحيح أنها أدخلت تحسينات ضخمة على الخلية ، ولكن لتحقيق نفس التأثير في mysqli في بعض الأحيان يتطلب جهدا هائلا على أي شركة تنمية نفط عمانالنقابي fetchAll.

بدلا من ذلك, نلقي نظرة على شركة تنمية نفط عمان, تحديدا إعداد البيانات و الإجراءات المخزنة.

$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";

نصائح أخرى

@ميشال أساسيات يجب أن تفكر - للأسف هناك خلل مع الخلية C API أن شركة تنمية نفط عمان الاستخدامات مما يعني أن تشغيل التعليمات البرمجية الخاصة بك على النحو الوارد أعلاه مع بعض إصدارات MySQL النتائج في الخطأ:

"خطأ في بناء الجملة أو انتهاك وصول:1414 أو INOUT حجة $parameter_number الروتينية $procedure_name غير متغير أو جديدة الزائفة متغير".

يمكنك ان ترى تقرير الشوائب على bugs.mysql.com.إنه تم تحديد الإصدار 5.5.3+ & 6.0.8+.

إلى حل المشكلة, سوف تحتاج إلى فصل في خارج المعلمات ، واستخدام متغيرات المستخدم لتخزين نتيجة مثل هذا:

$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";

ليست في الواقع إلزامية استخدام mysqli أو PDO استدعاء الإجراءات المخزنة في الخلية 5.يمكنك الاتصال بهم على ما يرام مع القديم mysql_ وظائف.الشيء الوحيد الذي يمكنك القيام به هو العودة عدة مجموعات النتائج.

لقد وجدت أن العودة عدة مجموعات النتائج إلى حد ما خطأ عرضه على أي حال ؛ أنها لا تعمل في بعض الحالات ولكن فقط إذا كان التطبيق يتذكر أن تستهلك كل منهم ، وإلا فإن الاتصال هو الأيسر في حالة كسر.

سوف تحتاج إلى استخدام MySQLI (الخلية تحسين التمديد) استدعاء الإجراءات المخزنة.هنا هو كيف يمكنك أن تدعوه SP:

$mysqli = new MySQLI(user,pass,db);

$result = $mysqli->query("CALL sp_mysp()");

عند استخدام واص سوف تحتاج أولا إغلاق resultset أو سوف تتلقى خطأ.هنا بعض مزيد من المعلومات :

http://blog.rvdavid.net/using-stored-procedures-mysqli-in-php-5/ (رابط معطل)

وبدلا من ذلك يمكنك استخدام أعدت البيانات, التي أجد مستقيم جدا إلى الأمام:

  $stmt = $mysqli->prepare("SELECT Phone FROM MyTable WHERE Name=?");

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

  $stmt->execute();

MySQLI الوثائق: http://no.php.net/manual/en/book.mysqli.php

لقد تم استخدام ADODB الذي هو شيء عظيم بالنسبة التلخيص الفعلية الأوامر تجعل المحمولة بين مختلف ملقمات SQL (أي الخلية mssql).بيد أن الإجراءات المخزنة لا يبدو أن تكون معتمدة مباشرة.ما يعنيه هذا هو أنه يجب تشغيل استعلام SQL كما لو كان واحد عادي ، ولكن "نداء" SP.مثال الاستعلام:

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

هذا ليس المحاسبية على البيانات التي تم إرجاعها ، وهو أمر مهم.أظن أن ذلك سيتم من خلال وضع @فار ، يمكنك اختيار نفسك عودة @متغير .

أن تكون مجردة على الرغم من على الرغم من أن صنع أول php إجراء مخزن يستند إلى ويب التطبيق كان من الصعب جدا العمل حول (mssql هو موثقة ، وهذا ليس) ، انها كبيرة بعد القيام به - التغييرات هي من السهل جدا لجعل بسبب الانفصال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top