ما هي أفضل طريقة للوصول إلى قاعدة بيانات من PHP?[مغلقة]

StackOverflow https://stackoverflow.com/questions/71088

  •  09-06-2019
  •  | 
  •  

سؤال

عند الوصول إلى الخلية قاعدة البيانات من PHP يبدو أن هناك عدة طرق:

Sprinkle the code with raw SQL-statements
Use the VO-pattern from Java (e.g. DB_DataObjects from PEAR)
DIY and write a script that auto-generates one PHP class per database 

وبصرف النظر عن هذا لقد قرأت أيضا عن LINQ in .NET ولكن لم أر ذلك في تنفيذها PHP.

ما أنماط أخرى هناك ؟

إذا كنت بدأت بناء موقع من الصفر اليوم ، أي واحد سوف تختار ؟

التوضيح:هذا ليس حول DB التجريد طبقات (شركة تنمية نفط عمان ، MDB2).نمط مناقشتها هنا هو شيء يمكنك بناء شركة تنمية نفط عمان أو MDB2.

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

المحلول

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

ويوفر ميزات مثل تحضير + تنفيذ مضاهاة عن DBs التي لا تدعم ذلك بشكل صحيح, و يتيح لك استخدام العناصر النائبة التي هي الممارسات الجيدة لتجنب حقن SQL المشاكل.

أنه سوف يعمل مع:mysql / mysqli, pgsql (كيو), oci8 (Oracle), sqllite, msql, mssql (Microsoft SQL Server), sybase, ينفورميكس, fbsql, ibase, odbc.

إلقاء نظرة على MDB2 الوثائق لنرى كيف يعمل.

نصائح أخرى

ما تبحث عنه هو كائن علائقي نموذج (ORM).هناك بضعة مختلفة منها هناك:

إذا اسندت هو أكثر من اللازم للمشروع الخاص بك, ثم يمكنك أن مجرد العودة إلى عام DB واجهة مثل شركة تنمية نفط عمان وبناء إعداد البيانات يدويا.

ما أنماط أخرى هناك ؟

ActiveRecord -- يمكنك ان ترى مثالا على هذا في يتوفر cakephp.

أعتقد أن ذلك يعتمد إلى حد كبير على الاحتياجات الخاصة بك - إذا كنت بناء تطبيق صغير, انها على الارجح أسرع لبناء DIY طبقة قاعدة البيانات.

إذا كنت بناء على طلب كبير مع الكثير من الجداول و العلاقات استخدام شيء من هذا القبيل للكيك هو ActiveRecord وظائف المحتمل أن يكون أسرع و أسهل.

أنا لم تستخدم الكمثرى هي طبقة تجريد بعد ولكن يبدو أيضا جيدة.زند أيضا قاعدة بيانات المكتبة في الإطار زند.

فإنه بالتأكيد سوف يعتمد على كيفية كبيرة من التطبيق على شبكة الإنترنت كنت تكتب.سأضيف الابهام بلدي حتى عقيدة (عند استخدامها بشكل مناسب).إذا كان farly صغيرة سريعة-n-القذرة المشروع ، وربما كنت قد مجرد الحصول على بعيدا مع استخدام شركة تنمية نفط عمان.

"ذلك يعتمد"

عن مشاريع بلدي, أنا أميل إلى استخدام إطار من نوع ما ، والذي يتضمن طبقة تجريد.للمشاريع الصغيرة التي ليست مناسبة framewok, أنا فقط وضعت SQL في سكربت (لأنه صغير).آخر مرة فعلت كبير في التطبيق دون إطار ، استخدمت شركة تنمية نفط عمان على أنه من السهل إعداد بيان الدعم ، إلخ.إنه من السهل جدا لتعلم طبقة تجريد.ربما استخدامه مرة أخرى ، إذا اخترت عدم استخدام إطار لسبب ما.

وبصرف النظر عن هذا لقد قرأت أيضا عن LINQ في .صافي ولكن لم أر ذلك نفذت في PHP.

شيء مثل Linq لا يمكن أن يكون بعد تنفيذها في PHP لأن اللغة تفتقر إلى البنى.وهو نوع من "وهمية linq" تم إنشاء, ولكن هذا فقط يستخدم السلاسل و ليست "حقيقية" linq.وحتى لو كان هو بشكل فعال فقط equivilent ينق على الكائنات و لا يوجد شيء هناك مثل Linq to SQL.

إذا كنت تريد وجوه المنحى النهج هنا ما توجهي مؤخرا.

أنا منفصلة الأمور إلى فئتين ،

أولا DatabaseTable الدرجة يأخذ اسم الجدول, سلسلة الطاولة الرئيسية.ثانيا, أنا خلق DatabaseObject الفئة التي تمثل على التوالي في DatabaseTable.على DatabaseObject اثنين من الروتين setFromRow و getAsRow.SetFromRow سوف إعداد كائن من مجموعة النقابي من col=>قيمة أزواج ، و الحصول على مثل صف أساسا تسلسل الكائن كما col=>قيمة أزواج.

على DatabaseTable يستخدم setFromRow لتصنيع DatabaseObjects عندما حدد الطريقة تسمى على الطاولة.على العكس من ذلك ، عندما قال أن تحديث أو إدراج البيانات في الجدول ، DatabsaeTable سوف تسلسل DatabaseObject باستخدام getAsRow.

عادة ما يحدث هو واحد يرث من DatabaseObject الخاصة بهم كائن معين ، ويعرف setFromRow و getAsRow ، DatabaseTable هو قال اسم DatabaseObject إلى مثيل.

إذا ما كنت في نهاية المطاف كتابة رمز الحكمة هو شيء من هذا القبيل

$dbTable = new DatabaseTable('tableName', 'uniqueid', 'InstanceType')
// dbTable manufactures an InstanceType for our use based on the select below
$dbRow = $dbTable->selectUsingId(15); 
print_r($dbRow);  // Dumps the InstanceTypeObject

هذا يفصل تمثيل البيانات (DatabaseObject) في طلبي من إدارة جداول قاعدة البيانات (DatabaseTable).لذا DatabaseObject يمكن أن يكون في C++ المصطلحات عادي يبلغ من العمر البيانات.

بالطبع يمكنك الذهاب إلى أبعد من ذلك ، كما قلت ، عن طريق إنشاء علاقات بين الجداول ، وخلق المزيد من الطرق لتحديد ، إلخ.

وأود أن أضيف أن دمج ما هو أساسا الإجرائية لغة (SQL) مع ما هو كائن-أورينتيدنيس ليست سهلة ، طريقة, أعرف, لها عيوبها و أنت من المحتمل أن تحصل على الكثير من إجابات مختلفة ولكل منها عيوب.

قد تحتاج أيضا إلى النظر في استخدام CodeIgniter, لطيفة قليلا إطار MVC PHP.فإنه على حد سواء ActiveRecord تنفيذ مجموعة معقولة من كائنات قاعدة البيانات (بما في ذلك الالتزام المتغيرات).أجد لها DB الطبقات أجمل بكثير من الافتراضي PHP MySQL واجهات برمجة التطبيقات ، و أبسط قليلا من PDOs (بالتأكيد أسهل لتثبيت).

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

أود أن استخدام كائن علائقي مخطط (ORM) ، مثل دفع: http://propel.phpdb.org/trac/

هذه الخرائط الأشياء الخاصة بك مباشرة إلى مخطط قاعدة البيانات - لا SQL المطلوبة.رسم الخرائط يحدث في ملف XML, الاستعلام يحدث من خلال معايير الكائنات.فمن الممكن أن الهندسة العكسية PHP دروس من قاعدة بيانات أو إنشاء قاعدة بيانات من مخطط xml.

لمزيد من المعلومات حول ORM في العام ، انظر http://en.wikipedia.org/wiki/Object-relational_mapping

لتنفيذ الأمر, كنت استخدم وظائف عادة تنفيذ أوامر SQL.هذه الوظائف يمكن استخدامها لجعل شيء أكثر تحديدا مثل get_users()

أ) جعل وظيفة لكل من استفسارات قد تحتاج إلى جعل ، كما

db_select($opts)

حيث $يختار هو تجزئة مجموعة مع مفاتيح:

['table_name', 'selection', 'condition', 'group_by', 'order_by', 'limit']

ب) إذا كنت تستخدم SQL بشكل كبير ، قد يميل إلى جعل الأمر SQL منشئ الذي يأخذ تجزئة مجموعة وإرجاع الأمر.شيء من هذا القبيل:

db_builder(array('select'=>array('customers','from'=>'bar','where'=>'foo=10')))

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

استخدام MVC هيكل قاعدة البيانات طبقة تجريد.بهذه الطريقة يمكنك الذهاب إلى مكان إلى إعادة صياغة تماما الداخلية من الوصول إلى البيانات الدرجة في حين الحفاظ على واجهة عامة ثابتة.

SQL الخام في جميع أنحاء رمز سيكون شبه مستحيل على نطاق واسع.

أنا أعمل على مستويين handcoded النهج:

المستوى الأول هو مجموعة بسيطة من الوظائف:

  • do_query(sql):ترجع (فتح) نتيجة الاعتراض.
  • get_record(sql):يعود أول سجل الاستعلام مغلقة.
  • get_datum(sql):يعود الحقل الأول من السجل الأول (الاستعلام مغلقة)

بعد أن أكتب بلدي نموذج طبقة مع وظائف محددة لجميع عمليات البيانات.عادة ما يكون ملف واحد مع أقسام لكل المفاهيمي الكائن.معايير مرتبطة مجردة البيانات SQL هيكل.كل SQL هو في هذه الطبقة.

يمكنك استخدام ORM مثل المذهب .

أي الطريقة جيدة طالما يمكنك تقليل النقاط التي تحتاج إلى تعديل التعليمات البرمجية الخاصة بك عندما الخاص بك تغييرات مخطط قاعدة البيانات (المدخلات, تصفية, صحة, شكل الجيل.... الخ).

أود أن يبقيه بسيط مع شركة تنمية نفط عمان, parametrized SQL و دروس هذا الملخص البيانات مجموعة عاد (::getActiveUsers(), ::getUserPersonalData() .... الخ).

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