PDOONE. إنه غلاف بسيط لمكتبة PDO الخاصة بـ PHP متوافق مع SQL Server (2008 R2 أو أعلى) أو MySQL (5.7 أو أعلى) و Oracle (12.1 أو أعلى).
تحاول هذه المكتبة العمل بأسرع ما يمكن . معظم العمليات عبارة عن إدارة بسيطة للسلسلة/المصفوفة وتعمل في المعدن العاري لمكتبة PDO ، ولكنها تسمح أيضًا بإنشاء ORM باستخدام EFTEC/PDOONYORM التمديد.
اقلب هذا
$ stmt = $ pdo -> prepare ( " SELECT * FROM myTable WHERE name = ? " );
$ stmt -> bindParam ( 1 , $ _POST [ ' name ' ], PDO :: PARAM_STR );
$ stmt -> execute ();
$ result = $ stmt -> get_result ();
$ products =[];
while ( $ row = $ result -> fetch_assoc ()) {
$ product []= $ row ;
}
$ stmt -> close ();في هذا
$ products = $ pdoOne
-> select ( " * " )
-> from ( " myTable " )
-> where ( " name = ? " ,[ $ _POST [ ' name ' ]])
-> toList ();أو باستخدام ORM (باستخدام مكتبة EFTEC/PDOONORM)
ProductRepo // this class was generated with echo $pdoOne()->generateCodeClass(['Product']); or using the cli.
:: where ( " name = ? " ,[ $ _POST [ ' name ' ]])
:: toList ();| exampleticketphp | مثال الكعك | مثال البحث | مثال طريقة مختلفة |
|---|---|---|---|
![]() | ![]() | ![]() |
المزيد من الأمثلة:
مثال MySQL PHP و PDO باستخدام PDOONE
تتطلب هذه المكتبة PHP 7.1 وأعلى ، وتتطلب تمديد PDO و PDO-MYSQL (MySQL) ، PDO-SQLSRV (SQL Server) أو PDO-OCI (Oracle)
تحرير Composer.json المتطلب التالي ، ثم تحديث الملحن.
{
"require" : {
"eftec/PdoOne" : " ^4.0.1 "
}
}أو تثبيته عبر CLI باستخدام
يتطلب الملحن EFTEC/PDOONE
فقط قم بتنزيل المجلد lib من المكتبة ووضعه في مشروع المجلد الخاص بك. ثم يجب تضمين جميع الملفات المضمنة عليها.
إنشاء مثيل للفئة pdoone على النحو التالي. بعد ذلك ، يمكنك فتح الاتصال باستخدام Method Connect () أو Open ()
use eftec PdoOne ;
// mysql
$ dao = new PdoOne ( " mysql " , " 127.0.0.1 " , " root " , " abc.123 " , " sakila " , "" );
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// sql server 10.0.0.1instance or (local)instance or machinenameinstance or machine (default instance)
$ dao = new PdoOne ( " sqlsrv " , " (local)sqlexpress " , " sa " , " abc.123 " , " sakila " , "" );
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// test (mockup)
$ dao = new PdoOne ( " test " , " anyy " , " any " , " any " , " any " , "" );
$ dao -> connect ();
// oci (oracle) ez-connect. Remember that you must have installed Oracle Instant client and added to the path.
$ cs = ' (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = instancia1))) ' ;
$ dao = new PdoOne ( " oci " , $ cs , " sa " , " abc.123 " ); // oracle uses the user as the schema
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// oci (oracle) tsnnames (the environment variables TNS_ADMIN and PATH must be correctly configured), also tnsnames.ora must exists.
$ cs = ' instancia1 ' ;
$ dao = new PdoOne ( " oci " , $ cs , " sa " , " abc.123 " ); // oracle uses the user as the schema
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();أين
$ dao = new pdoone ("mysql" ، "127.0.0.1" ، "root" ، "ABC.123" ، "Sakila" ، "") ؛
أوراكل صعب التثبيت. في Windows ، من مجلد Oracle Home's Bin ، يجب عليك نسخ جميع DLL إلى مجلد PHP ومجلد Apache.
باستخدام Method Runrawquery () ، يمكننا تنفيذ أمر مباشرة إلى PDO مع أو بدون معلمات. ويمكن أن يعيد pdostatement أو صفيف . إنه مفيد عندما نريد السرعة.
RunRawquery ($ rawsql ، $ param ، $ returnarray ، $ fetchmode ، $ fetchargument)
السلسلة $ rawsql الاستعلام لتنفيذ Array | null $ param [type1 ، value1 ، type2 ، value2] أو [name1 => value ، name2 = value2] bool $ returnarray if true (افتراضي) ثم يعيد صفيف. إذا كان خطأ ، فإنه يعيد pdostatement int $ fetchmode يشير إلى وضع الجلب. مثال: PDO :: FETCH_ASSOC NULL $ FECTARGUMITY وسيطة fetchmode.
$ sql = ' select * from table where id=1 ' ;
$ pdoStatement = $ pdoOne -> runRawQuery ( $ sql ,[], false ); // [] are the parametersلكن يمكننا تغييره لإرجاع صفيف
$ sql = ' select * from table where id=1 ' ;
$ values = $ pdoOne -> runRawQuery ( $ sql ); // [] are the parametersيمكننا أيضا تمرير المعلمات.
$ values = $ con -> runRawQuery ( ' select * from table where id=? ' ,[ 20 ]); // with parameter
$ values = $ con -> runRawQuery ( ' select * from table where id=:name ' ,[ ' name ' => 20 ]); // with named parameter
$ values = $ con -> runRawQuery ( ' select * from table ' ,[]); // without parameter.ملاحظة ، تستخدم هذه المكتبة عبارات معدّة ، لذلك فهي خالية من حقن SQL (إذا كنت تستخدم المعلمات)
$ name = " O'hara " ;
$ values = $ con -> runRawQuery ( " select * from table where name=:name " ,[ ' name ' => $ name ]); // it works.✅
$ values = $ con -> runRawQuery ( " select * from table where name=? " ,[ $ name ]); // it works ok.✅
$ values = $ con -> runRawQuery ( " select * from table where name=' $ name ' " ); // it will crash.مع الطريقة Runquery () يمكننا تنفيذ بيان معد في PDO. إنه مفيد عندما نريد نقل الحجج إليها. يتطلب Runquery () pdo preparedstatement .
لا ينصح هذه الطريقة إلا إذا كنت تعمل بالفعل مع عبارات PDO ، ولا تريد تكييف جميع التعليمات البرمجية الخاصة بك.
$ sql = " insert into `product`(name) values(?) " ;
$ stmt = $ pdoOne -> prepare ( $ sql );
$ productName = " Cocacola " ;
$ stmt -> bind_param ( " s " , $ productName ); // s stand for a string. Also i =integer, d = double and b=blob
$ rows = $ pdoOne -> runQuery ( $ stmt );
$ allRows = $ rows -> fetch_all ( PDO :: FETCH_ASSOC );يمكنك استخدام منشئ الاستعلام لإنشاء أمرك. يمكنك التحقق من الفصل حول Builder Builder (DQL) لمزيد من المعلومات.
// query builder
$ pdoOne -> set ([ ' name ' => ' cocacola ' ])
-> from ( ' product ' )
-> insert ();يسمح المكتبة Eftec pdooneorm بإنشاء [ORM] (#Iorm) من الجداول الخاصة بك. إذا تم إنشاء ORM ، فيمكنك استخدام الكود التالي
ProductRepo:: toList ([ ' category ' => ' drink ' ]);حيث Productrepo هو فئة خدمة تم إنشاؤها باستخدام ORM.
بشكل افتراضي ، يقوم PDOONE بتنفيذ الاستعلامات في الوضع pdo :: fetch_assoc يمكنك تغييره عن طريق تشغيل الاستعلامات على النحو التالي:
$ pdo -> setFechMode ( PDO :: FETCH_CLASS , ' stdClass ' )-> runRawQuery ( $ query );
// or you can run as
$ pdo -> runRawQuery ( $ query , null , true , false , null , PDO :: FETCH_CLASS , ' stdClass ' )PDOONE يسمح 5 أنواع من التواريخ.
تنسيق SQL هو التنسيق كيفية تخزين التاريخ في قاعدة البيانات. ذلك يعتمد على نوع قاعدة البيانات. على سبيل المثال ، يمكن لـ MySQL استخدام تنسيق YMD.
التنسيق البشري هو التنسيق كيف يبدو المستخدم النهائي تاريخنا.
تنسيق تاريخ ISO . هذا هو التنسيق كيف يمكن نقل القيمة وتسلسلها.
الطابع الزمني : يعد عدد الثواني بعد 1-1-1970
فئة الفئة / PHP : إنه كائن DateTime .
هناك 3 طرق لتشغيل المعاملة:
| طريقة | وصف |
|---|---|
| StartTransaction () | يبدأ الصفقة. اعتمادًا على قاعدة بيانات النوع ، يمكن تكديسها أم لا. |
| يقترف() | الالتزام (ويغلق) معاملة |
| التراجع () | التراجع (ويغلق) معاملة |
مثال:
try {
$ sql = " insert into `product`(name) values(?) " ;
$ pdoOne -> startTransaction ();
$ result = $ pdoOne -> runRawQuery ( $ sql ,[ ' Fanta ' => $ productName ], false );
$ pdoOne -> commit (); // transaction ok
} catch ( Exception $ e ) {
$ pdoOne -> rollback ( false ); // error, transaction cancelled, the false means that it doesn't throw an exception if we want rollback.
}إرجاع صحيح في حالة وجود الجدول (قاعدة البيانات/المخطط الحالية)
إرجاع الإحصائيات (كصفيف) لعمود من الجدول.
$ stats = $ pdoOne -> statValue ( ' actor ' , ' actor_id ' );| دقيقة | الأعلى | متوسط | مجموع | عدد |
|---|---|---|---|---|
| 1 | 205 | 103.0000 | 21115 | 205 |
إرجاع جميع أعمدة الجدول
$ result = $ pdoOne -> columnTable ( ' actor ' );| Colname | كولتي | كولسيز | كولبرز | colscale | إيسكي | isidentity |
|---|---|---|---|---|---|---|
| ACTOR_ID | صغير | 5 | 0 | 1 | 1 | |
| الاسم الأول | varchar | 45 | 0 | 0 | ||
| اسم العائلة | varchar | 45 | 0 | 0 | ||
| last_update | الطابع الزمني | 0 | 0 |
يعيد جميع المفاتيح الأجنبية للجدول (جدول المصدر)
ينشئ جدول باستخدام تعريف ومفتاح أساسي.
ملاحظة: يمكنك إنشاء رمز لإنشاء جدول باستخدام جدول موجود عن طريق تنفيذ CLI (رمز فئة الإخراج)
php pdoone.php -database mysql -Server 127.0.0.1 -user root -pwd ABC.123 -DB Sakila -inp
مثال: (MySQL)
$ pdo -> createTable ( ' film ' ,
[
" film_id " => " smallint unsigned not null auto_increment " ,
" title " => " varchar(255) not null " ,
" description " => " text " ,
" release_year " => " year " ,
" language_id " => " tinyint unsigned not null " ,
" original_language_id " => " tinyint unsigned " ,
" rental_duration " => " tinyint unsigned not null default '3' " ,
" rental_rate " => " decimal(4,2) not null default '4.99' " ,
" length " => " smallint unsigned " ,
" replacement_cost " => " decimal(5,2) not null default '19.99' " ,
" rating " => " enum('G','PG','PG-13','R','NC-17') default 'G' " ,
" special_features " => " set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') " ,
" last_update " => " timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP "
],[
" film_id " => " PRIMARY KEY " ,
" title " => " KEY " ,
" language_id " => " FOREIGN KEY REFERENCES`language`(`language_id`) ON UPDATE CASCADE " ,
" original_language_id " => " FOREIGN KEY REFERENCES`language`(`language_id`) ON UPDATE CASCADE "
]); $ pdo -> createTable ( ' film ' ,
[
" film_id " => " smallint unsigned not null auto_increment " ,
" title " => " varchar(255) not null " ,
" description " => " text " ,
" release_year " => " year " ,
" language_id " => " tinyint unsigned not null " ,
" original_language_id " => " tinyint unsigned " ,
" rental_duration " => " tinyint unsigned not null default '3' " ,
" rental_rate " => " decimal(4,2) not null default '4.99' " ,
" length " => " smallint unsigned " ,
" replacement_cost " => " decimal(5,2) not null default '19.99' " ,
" rating " => " enum('G','PG','PG-13','R','NC-17') default 'G' " ,
" special_features " => " set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') " ,
" last_update " => " timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP "
], ' film_id ' ); مثال (SQLSRV)
$ pdo -> createTable ( ' film ' ,
[
" film_id " => " int NOT NULL IDENTITY(1,1) " ,
" title " => " varchar(255) NOT NULL " ,
" description " => " text(2147483647) DEFAULT (NULL) " ,
" release_year " => " varchar(4) " ,
" language_id " => " tinyint NOT NULL " ,
" original_language_id " => " tinyint DEFAULT (NULL) " ,
" rental_duration " => " tinyint NOT NULL DEFAULT ((3)) " ,
" rental_rate " => " decimal(4,2) NOT NULL DEFAULT ((4.99)) " ,
" length " => " smallint DEFAULT (NULL) " ,
" replacement_cost " => " decimal(5,2) NOT NULL DEFAULT ((19.99)) " ,
" rating " => " varchar(10) DEFAULT ('G') " ,
" special_features " => " varchar(255) DEFAULT (NULL) " ,
" last_update " => " datetime NOT NULL DEFAULT (getdate()) "
],[
" language_id " => " FOREIGN KEY REFERENCES language(language_id) " ,
" original_language_id " => " FOREIGN KEY REFERENCES language(language_id) " ,
" film_id " => " PRIMARY KEY "
]);يرجع قائمة من الجداول التي تطلبها التبعية (من عدم وجود تعتمد إلى أكثر تعتمد)
ملاحظة : هذه العملية ليست مضمونة لأن الجداول يمكن أن يكون لها مراجع دائرية.
$ dao = new PdoOne ( ' sqlsrv ' , " (local)sqlexpress " , " sa " , " abc.123 " , " sakila " );
$ dao -> open ();
echo " <pre> " ;
var_dump ( $ dao -> tableSorted ( 3 , false , true )); // it returns the tables sortered
var_dump ( $ dao -> tableSorted ( 3 , true , true )); // it returns all the tables that can't be sortered
echo " </pre> " ;يقوم بالتحقق من صحة الجدول إذا كان الجدول يطابق التعريف المحدد بالقيم.
$def=[
"film_id" => "int NOT NULL IDENTITY(1,1)",
"title" => "varchar(255) NOT NULL",
"description" => "text(2147483647) DEFAULT (NULL)",
"release_year" => "varchar(4)",
"language_id" => "tinyint NOT NULL",
"original_language_id" => "tinyint DEFAULT (NULL)",
"rental_duration" => "tinyint NOT NULL DEFAULT ((3))",
"rental_rate" => "decimal(4,2) NOT NULL DEFAULT ((4.99))",
"length" => "smallint DEFAULT (NULL)",
"replacement_cost" => "decimal(5,2) NOT NULL DEFAULT ((19.99))",
"rating" => "varchar(10) DEFAULT ('G')",
"special_features" => "varchar(255) DEFAULT (NULL)",
"last_update" => "datetime NOT NULL DEFAULT (getdate())"
];
$keys=[
"language_id" => "FOREIGN KEY REFERENCES language(language_id)",
"original_language_id" => "FOREIGN KEY REFERENCES language(language_id)",
"film_id" => "PRIMARY KEY"
];
var_dump(PdoOne::validateDefTable(self::getPdoOne(),self::TABLE,$def,$keys));
يعيد جميع المفاتيح الأجنبية للجدول.
$ result = $ pdoOne -> foreignKeyTable ( ' actor ' );| collocal | TAPEREM | كولريم |
|---|---|---|
| customer_id | عميل | customer_id |
| RENTAL_ID | تأجير | RENTAL_ID |
| staft_id | طاقم عمل | staft_id |
يمكنك أيضا بناء استعلام إجرائي.
مثال:
$ results = $ pdoOne -> select ( " * " )-> from ( " producttype " )
-> where ( ' name=? ' , [ ' Cocacola ' ])
-> where ( ' idproducttype=? ' , [ 1 ])
-> toList (); يشير إلى الأعمدة للعودة. الوسيطة هي أمر SQL ، لذلك يسمح لأي عملية دعم قاعدة البيانات ، بما في ذلك الوظائف والثوابت والمشغلين والاسم المستعار وما شابه.
$ results = $ pdoOne -> select ( " col1,col2 " ); //...يولد الاستعلام: حدد Col1 ، Col2 ....
$ results = $ pdoOne -> select ( " select * from table " ); //->...يولد الاستعلام: حدد * من الجدول ....
يولد استعلام يرجع عدد القيم. إنه ماكرو للطريقة SELECT ()
$ result = $ pdoOne -> count ( ' from table where condition=1 ' ); // select count(*) from table where c..
$ result = $ pdoOne -> count ()-> from ( ' table ' )-> where ( ' condition=? ' ,[ 1 ]); // select count(*) from table where c..
$ result = $ pdoOne -> count ( ' from table ' , ' col1 ' ); // select count(col1) from table
$ result = $ pdoOne -> count ()-> from ( ' table ' ); // select count(*) from tableيولد استعلام يرجع الحد الأدنى لقيمة العمود. إذا كان $ arg فارغًا ، فإنه يستخدم $ SQL لاسم العمود ، فهو ماكرو للطريقة SELECT ()
$ result = $ pdoOne -> min ( ' from table where condition=1 ' , ' col ' ); // select min(col) from table where c..
$ result = $ pdoOne -> min ( ' from table ' , ' col1 ' ); // select min(col1) from table
$ result = $ pdoOne -> min ( '' , ' col1 ' )-> from ( ' table ' ); // select min(col1) from table
$ result = $ pdoOne -> min ( ' col1 ' )-> from ( ' table ' ); // select min(col1) from tableيولد استعلام يرجع القيمة القصوى للعمود. إذا كان $ arg فارغًا ، فإنه يستخدم $ SQL لاسم العمود ، فهو ماكرو للطريقة SELECT ()
$ result = $ pdoOne -> max ( ' from table where condition=1 ' , ' col ' ); // select max(col) from table where c..
$ result = $ pdoOne -> max ( ' from table ' , ' col1 ' ); // select max(col1) from tableيولد استعلام يرجع قيمة مجموع العمود. إذا كان $ arg فارغًا ، فإنه يستخدم $ SQL لاسم العمود ، فهو ماكرو للطريقة SELECT ()
$ result = $ pdoOne -> sum ( ' from table where condition=1 ' , ' col ' ); // select sum(col) from table where c..
$ result = $ pdoOne -> sum ( ' from table ' , ' col1 ' ); // select sum(col1) from tableيولد استعلامًا يعيد متوسط قيمة العمود. إذا كان $ arg فارغًا ، فإنه يستخدم $ SQL لاسم العمود ، فهو ماكرو للطريقة SELECT ()
$ result = $ pdoOne -> avg ( ' from table where condition=1 ' , ' col ' ); // select avg(col) from table where c..
$ result = $ pdoOne -> avg ( ' from table ' , ' col1 ' ); // select avg(col1) from tableيولد أمر محدد.
$ results = $ pdoOne -> select ( " col1,col2 " )-> distinct (); //...يولد الاستعلام: حدد Col1 ، Col2 ...
ملاحظة: -> إرجاع متميز ("فريد") حدد فريدًا ..
يولد أمر "من" SQL.
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' ); //...يولد الاستعلام: حدد * من الجدول
يمكن أن تكون الجداول $ جدولًا واحدًا أو بناء SQL. بالنسبة للبشر ، يكون الأمر التالي صالحًا:
$ results = $ pdoOne -> select ( " * " )-> from ( ' table t1 inner join t2 on t1.c1=t2.c2 ' ); //...يولد أمر أين.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=1 ' ); //...حيث يمكن التعبير عنها بطرق مختلفة.
من الممكن كتابة مكان بدون معلمات على النحو التالي:
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=1 and p2>2.5 or p3 like '%aa%' " ); $ aa = ' aa ' ;
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=? and p2>? or p3 like ? " ,[ 1
, 2.5
, " % $ aa % " ]);كما أنه يعمل
// (if there is only a single argument without a type)
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1=? " ,[ 1 ]); // = where("p1=?",[1]);
// (if we don't define to where to put the value)
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ( " p1 " ,[ 1 ]); // = where("p1=?",[1]); إنه تعريف اختصار للاستعلام باستخدام صفيف نقابي ، حيث يكون المفتاح هو اسم العمود والقيمة هي القيمة المراد مقارنة
إنه يعمل فقط مع المساواة (=) ومشغل المنطق "و" (يتم تعريف النوع تلقائيًا)
// select * from table where p1='1' and p2='2.5' and p3='aa'
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ([ ' p1 ' => 1
, ' p2 ' => 2.5
, ' p3 ' => ' aa ' ]); أيضا ، من الممكن تحديد نوع المعلمة.
// select * from table where p1=1 and p2='2.5' and p3='aa'
$ results = $ pdoOne -> select ( " * " )-> from ( ' table ' )-> where ([ ' p1 ' =>[ 1 ]
, ' p2 ' =>[ 2.5 ]
, ' p3 ' =>[ ' aa ' ]]); يمكنك أيضًا استخدام صفيف ترابط كوسيطة ومعلمات تسمية في الاستعلام
$ results = $ pdoOne -> select ( " * " )-> from ( " table " )
-> where ( ' condition=:p1 and condition2=:p2 ' ,[ ' p1 ' => ' Coca-Cola ' , ' p2 ' => 1 ])
-> toList ();يولد الاستعلام: حدد * من الجدول أين الحالة =؟ (Coca-Cola) و inction2 =؟ (1)
يولد الاستعلام: حدد * من الجدول حيث p1 = 1
ملاحظة: ArrayParameters هي صفيف كما يلي: النوع ، القيمة.
حيث يكون النوع i = integer ، d = double ، s = string أو b = blob. في حالة الشك ، استخدم "S" (انظر Table Bellow)
مثال على ArrayParameters:
[1 ، "مرحبا" ، 20.3 ، "العالم"]
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? ' ,[ 1 ]); //...يولد الاستعلام: حدد * من الجدول حيث p1 =؟ (1)
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? and p2=? ' ,[ 1 , ' hello ' ]); //...يولد الاستعلام: حدد * من الجدول حيث p1 =؟ (1) و p2 =؟ ('hello')
ملحوظة. أين يمكن أن يكون متداخلًا.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? ' ,[ 1 ])
-> where ( ' p2=? ' ,[ ' hello ' ]); //...يولد الاستعلام: حدد * من الجدول حيث p1 =؟ (1) و p2 =؟ ('hello')
يمكنك أيضا استخدام:
$ results = $ pdoOne -> select ( " * " )-> from ( " table " )
-> where ([ ' p1 ' => ' Coca-Cola ' , ' p2 ' => 1 ])
-> toList ();يولد الاستعلام: حدد * من الجدول حيث P1 =؟ (Coca-Cola) و P2 =؟ (1)
يولد أمر الطلب.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> order ( ' p1 desc ' ); //...يولد الاستعلام: حدد * من ترتيب الجدول بواسطة P1 DESC
يولد أمر المجموعة.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> group ( ' p1 ' ); //...يولد الاستعلام: حدد * من مجموعة الجدول بواسطة P1
يولد الأمر.
ملاحظة: يستخدم نفس المعلمات مثل ()
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> group ( ' p1 ' )
-> having ( ' p1>? ' , array ( 1 )); //...يولد الاستعلام: حدد * من مجموعة الجدول بواسطة p1 وجود p1>؟ (1)
ملاحظة: يمكن أن يكون متداخلًا ()-> وجود ()
ملاحظة: يمكن أن يكون بدون معلمات ("Col> 10")
تشغيل الاستعلام توليد.
لاحظ إذا كان ReturnArray صحيحًا ، فإنه يعيد صفيفًا نقابيًا. إذا كانت Returnarray خاطئة ، فإنها تُرجع mysqli_result
ملاحظة: تقوم بإعادة تعيين المعلمات الحالية (مثل SELECT الحالية ، من ، أين ، إلخ)
إنه ماكرو من Rungen () . يعيد صفيفًا نقابيًا أو خطأ إذا فشلت العملية.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toList (); يرجع pdostatement من الاستعلام الحالي
ملاحظة: إذا كنت تريد حلقة البيان ، فيمكنك استخدام FetchLoop ()
مثال :
$ stmt = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toPdoStatement ();
while ( $ row = $ stmt -> fetch ()) {
// do something
} إنه يجلب استعلامًا لكل صف.
يمكن استخدام هذه الطريقة عندما لا نريد قراءة جميع المعلومات في وقت واحد ، حتى تتمكن من القراءة ومعالجة كل سطر بشكل منفصل
مثال :
$ this -> select ( ' select id,name from table ' )
-> fetchLoop ( static function ( $ row ) { return ( $ row );}, PDO :: FETCH_ASSOC )يعيد metacode (تعريفات) لكل عمود من الاستعلام.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toMeta (); أو
$ results = $ pdoOne -> toMeta ( ' select * from table ' ); نتيجة:
array(3) {
[0]=>
array(7) {
["native_type"]=>
string(4) "LONG"
["pdo_type"]=>
int(2)
["flags"]=>
array(2) {
[0]=>
string(8) "not_null"
[1]=>
string(11) "primary_key"
}
["table"]=>
string(11) "producttype"
["name"]=>
string(13) "idproducttype"
["len"]=>
int(11)
["precision"]=>
int(0)
}
[1]=>
array(7) {
["native_type"]=>
string(10) "VAR_STRING"
["pdo_type"]=>
int(2)
["flags"]=>
array(0) {
}
["table"]=>
string(11) "producttype"
["name"]=>
string(4) "name"
["len"]=>
int(135)
["precision"]=>
int(0)
}
}
إنه ماكرو من Rungen. يعيد صفيف مفهرس من العمود الأول
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toListSimple (); // ['1','2','3','4'] إنه يعيد صفيفًا نقابيًا حيث تكون القيمة الأولى هي المفتاح والثانية هي القيمة.
إذا كانت القيمة الثانية غير موجودة ، فهي تستخدم الفهرس كقيمة (القيمة الأولى).
$ results = $ pdoOne -> select ( " cod,name " )
-> from ( ' table ' )
-> toListKeyValue (); // ['cod1'=>'name1','cod2'=>'name2'] إنه ماكرو من Rungen. يعيد mysqli_result أو null.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> toResult (); // يرجع العددية الأولى (قيمة واحدة) من الاستعلام. إذا كان $ colname فارغًا ، فإنه يستخدم العمود الأول.
$ count = $ this -> count ( ' from product_category ' )-> firstScalar ();إنه ماكرو من Rungen. يعيد الصف الأول إن وجد ، إن لم يكن ، فإنه يعيد خطأ ، كصفيف ترابط.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> first (); إنه ماكرو من Rungen. إنه يعيد الصف الأخير (إن وجد ، إن لم يكن ، فإنه يعيد خطأ) كصفيف ترابط.
$ results = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> last (); في بعض الأحيان يكون أكثر كفاءة لتشغيل Order () و First () لأن Last () يقرأ جميع القيم.
يعيد الأمر SQL وسلسلة.
$ sql = $ pdoOne -> select ( " * " )
-> from ( ' table ' )
-> sqlGen ();
echo $ sql ; // returns select * from table
$ results = $ pdoOne -> toList (); // executes the queryملاحظة: لا يعيد تعيين الاستعلام.
هناك أربع طرق لتنفيذ كل أمر.
دعنا نقول أننا نريد إضافة عدد صحيح في العمود Col1 مع القيمة 20
المخطط والقيم باستخدام قائمة القيم : حيث تكون القيمة الأولى هي العمود ، والثاني هو نوع القيمة (i = integer ، d = double ، s = string ، b = blob) والمصفوفة الثانية تحتوي على القيم.
$ pdoOne -> insert ( " table "
,[ ' col1 ' ]
,[ 20 ]);المخطط والقيم في نفس القائمة : حيث تكون القيمة الأولى هي العمود ، والثاني هو نوع القيمة (i = integer ، d = double ، s = string ، b = blob) والثالث هو القيمة.
$ pdoOne -> insert ( " table "
,[ ' col1 ' , 20 ]);المخطط والقيم باستخدام صفيفتين ترابطتين :
$ pdoOne -> insert ( " table "
,[ ' col1 ' ]
,[ ' col1 ' => 20 ]);المخطط والقيم باستخدام صفيف ترابط واحد : يتم حساب النوع تلقائيًا.
$ pdoOne -> insert ( " table "
,[ ' col1 ' => 20 ]);يولد أمر إدراج.
$ pdoOne -> insert ( " producttype "
,[ ' idproducttype ' , ' name ' , ' type ' ]
,[ 1 , ' cocacola ' , 1 ]);باستخدام سلسلة متداخلة (صفيف واحد)
$ pdoOne -> from ( " producttype " )
-> set ([ ' idproducttype ' , 0 , ' name ' , ' Pepsi ' , ' type ' , 1 ])
-> insert ();باستخدام سلسلة متعددة متداخلة
$ pdoOne -> from ( " producttype " )
-> set ( " idproducttype=? " ,[ 101 ])
-> set ( ' name=? ' ,[ ' Pepsi ' ])
-> set ( ' type=? ' ,[ 1 ])
-> insert ();أو (يتم تعريف النوع ، بشكل ممكن ، تلقائيًا بواسطة MySQL)
$ pdoOne -> from ( " producttype " )
-> set ( " idproducttype=? " ,[ 101 ])
-> set ( ' name=? ' , ' Pepsi ' )
-> set ( ' type=? ' , 1 )
-> insert (); $ pdoOne -> insertObject ( ' table ' ,[ ' Id ' => 1 , ' Name ' => ' CocaCola ' ]);باستخدام مجموعة إعلانية متداخلة
$ pdoOne -> from ( " producttype " )
-> set ( ' (idproducttype,name,type) values (?,?,?) ' ,[ 100 , ' Pepsi ' , 1 ])
-> insert ();يولد الاستعلام: إدراج في ProductStype (IdProductType ، الاسم ، النوع) القيم (؟ ،؟ ،؟) ....
يولد أمر إدراج.
$ pdoOne -> update ( " producttype "
,[ ' name ' , ' type ' ] //set
,[ 6 , ' Captain-Crunch ' , 2 ] //set
,[ ' idproducttype ' ] // where
,[ 6 ]); // where $ pdoOne -> update ( " producttype "
,[ ' name ' => ' Captain-Crunch ' , ' type ' => 2 ] // set
,[ ' idproducttype ' => 6 ]); // where $ pdoOne -> from ( " producttype " )
-> set ( " name=? " ,[ ' Captain-Crunch ' ]) //set
-> set ( " type=? " ,[ 6 ]) //set
-> where ( ' idproducttype=? ' ,[ 6 ]) // where
-> update (); // updateأو
$ pdoOne -> from ( " producttype " )
-> set ( " name=? " , ' Captain-Crunch ' ) //set
-> set ( " type=? " , 6 ) //set
-> where ( ' idproducttype=? ' ,[ 6 ]) // where
-> update (); // updateيولد الاستعلام: تحديث
nameتعيين ProductType =؟ ،type=؟ أينidproducttype=؟ ....
يولد أمر حذف.
$ pdoOne -> delete ( " producttype "
,[ ' idproducttype ' ] // where
,[ 7 ]); // where $ pdoOne -> delete ( " producttype "
,[ ' idproducttype ' => 7 ]); // whereيولد الاستعلام: حذف من ProductType حيث
idproducttype=؟ ....
يمكنك أيضا حذف عبر سلسلة منشئ DQL.
$ pdoOne -> from ( " producttype " )
-> where ( ' idproducttype=? ' ,[ 7 ]) // where
-> delete (); $ pdoOne -> from ( " producttype " )
-> where ([ ' idproducttype ' => 7 ]) // where
-> delete (); يولد الاستعلام: حذف من ProductType حيث
idproducttype=؟ ....
من الممكن اختياريًا لتخزين نتيجة الاستعلامات. يتم تعريف مدة الاستعلام أيضًا في الاستعلام. إذا لم يتم تخزين نتيجة الاستعلام ، فسيتم حسابه بشكل طبيعي (تنفيذ الاستعلام في قاعدة البيانات). لتحديد الاستعلام على أنه فريد من نوعه ، يقوم النظام بإنشاء معرف فريد (UID) يعتمد على SHA256 الذي تم إنشاؤه باستخدام الاستعلام والمعلمات والأساليب ونوع التشغيل.
لا تقوم المكتبة بأي عملية ذاكرة التخزين المؤقت مباشرةً ، وبدلاً من ذلك ، فإنها تسمح بتخزين النتائج باستخدام مكتبة خارجية.
class CacheService implements eftec IPdoOneCache {
public $ cacheData =[];
public $ cacheCounter = 0 ; // for debug
public function getCache ( $ uid , $ family = '' ) {
if ( isset ( $ this -> cacheData [ $ uid ])) {
$ this -> cacheCounter ++;
echo " using cache n" ;
return $ this -> cacheData [ $ uid ];
}
return false ;
}
public function setCache ( $ uid , $ family = '' , $ data = null , $ ttl = null ) {
$ this -> cacheData [ $ uid ]= $ data ;
}
public function invalidateCache ( $ uid = '' , $ family = '' ) {
unset( $ this -> cacheData [ $ uid ]);
}
}
$ cache = new CacheService ();(2) يعين خدمة ذاكرة التخزين المؤقت
$ pdoOne = new PdoOne ( " mysql " , " 127.0.0.1 " , " travis " , "" , " travisdb " );
$ cache = new CacheService ();
$ $ pdoOne -> setCacheService ( $ cache );(3) استخدم ذاكرة التخزين المؤقت على النحو التالي ، يجب علينا إضافة الطريقة USECache () في أي جزء من الاستعلام.
$ pdoOne -> select ( ' select * from table ' )
-> useCache ()-> toList (); // cache that never expires
$ pdoOne -> select ( ' select * from table ' )
-> useCache ( 1000 )-> toList (); // cache that lasts 1000ms. class CacheService implements eftec IPdoOneCache {
public function getCache ( $ uid , $ family = '' ) {
return apcu_fetch ( $ uid );
}
public function setCache ( $ uid , $ family = '' , $ data = null , $ ttl = null ) {
apcu_store ( $ uid , $ data , $ ttl );
}
public function invalidateCache ( $ uid = '' , $ family = '' ) {
// invalidate cache
apcu_delete ( $ uid );
}
}
$ cache = new CacheService ();التسلسل هو بديل لحقل Auto_numeric (الهوية). لديها طريقتان لإنشاء تسلسل: ندفة الثلج والتسلسل . إنه بديل لإنشاء GUID بشكل رئيسي لأنه يعيد رقمًا (عادةً ما يكون GUID عبارة عن سلسلة أنها أكثر تكلفة للفهرس والتخزين)
الهدف من التسلسل هو إنشاء رقم فريد لا يتكرر أبدًا.
$ dao -> nodeId = 1 ; // optional
$ dao -> tableSequence = ' snowflake ' ; // optional
$ dao -> createSequence (); // it creates a table (and it could create a store procedure) called snowflake and a function called next_snowflake(). You could create it only once.من الممكن إنشاء تسلسل جديد بدون أي جدول. إنه سريع ، ولكن يمكن أن يعاني من مشاكل في التصادم.
إنه يضمن رقمًا خالٍ من التصادم فقط إذا لم نقم بإجراء أكثر من عملية واحدة لكل 0.0001 ثانية ، فإنه يضيف أيضًا رقمًا عشوائيًا زائدًا (0-4095 على الوقت) ، وبالتالي فإن فرص التصادم هي 1/4095 (لكل عمليتين يتم كلتين كل 0.0001 ثانية). يعتمد على رقم ندفة الثلج على Twitter. أي. أنت آمن للتصادم إذا كنت تقوم بأقل من مليون عملية في الثانية (من الناحية الفنية: 45 مليون).
$ pdo-> getSequencePhp ([غير متوقع = خطأ]) إرجاع تسلسل دون استخدام جدول. هذا التسلسل أكثر كفاءة من الحصول على $ dao-> ، لكنه يستخدم قيمة عشوائية للتعامل مع الاصطدامات.
إذا كان الأمر صحيحًا ، فإنه يعيد رقمًا لا يمكن التنبؤ به (يقلب بعض الأرقام)
$ pdo -> getSequencePHP () // string(19) "3639032938181434317" $ dao -> getSequencePHP ( true ) // string(19) "1739032938181434311" $ pdo ->getSequence() // string(19) "3639032938181434317"
$ pdo -> getSequencePHP () // string(19) "3639032938181434317" $ pdo -> getSequence ( true ) // returns a sequence by flipping some values.
$ pdo -> getSequencePHP ( true ) // string(19) "1739032938181434311" | مجال | وصف | مثال |
|---|---|---|
| بادئة $ | إذا كنا بحاجة إلى إضافة بادئة إلى كل جدول | $ this-> prepixbase = 'example_' ؛ |
| $ internalcachecounter | عداد ضربات ذاكرة التخزين المؤقت الداخلية. | $ this-> internalcachecounter = ؛ |
| $ nodeid | تستخدم من قبل التسلسل (ندفة الثلج). Nodeid هو معرف العقدة. يجب أن يكون بين 0..1023 | $ this-> nodeid = 3 ؛ |
| tablesequence $ | اسم تسلسل الجدول (ندفة الثلج) | $ this-> tableSequence = "tableSeq1" ؛ |
| $ أقنعة | إذا أردنا إنشاء رقم غير متوقع (يستخدم بالتسلسل) | $ this-> masks0 = [0،1،2،3،4] ؛ |
| $ Masks1 | إذا أردنا إنشاء رقم غير متوقع (يستخدم بالتسلسل) | $ this-> masks1 = [4،3،2،1،0] ؛ |
| $ databasetype | النوع الحالي من قاعدة البيانات. تم تعيينه عبر مُنشئ EL | صدى $ this-> databaseType ؛ |
| خادم $ | جهاز الخادم الحالي | صدى $ this-> الخادم ؛ |
| مستخدم $ | المستخدم الحالي | echo $ this-> user ؛ |
| $ pwd | كلمة المرور الحالية | صدى $ this-> pwd ؛ |
| $ DB | قاعدة البيانات أو المخطط الحالي (تتجاهل Oracle هذه القيمة) | صدى $ this-> db ؛ |
| $ charset | لتعيين charset الافتراضي. يجب تعيينه عبر مُنشئ | صدى $ this-> charset ؛ |
| $ isopen | صحيح إذا كانت قاعدة البيانات متصلة بخلاف ذلك ، فهي خاطئة | if ($ this-> isopen) {...} ؛ |
| $ throwonerror | إذا كان صحيحًا (افتراضيًا) ، فإنه يرمي خطأ إذا حدث خطأ. إذا كان خطأ ، فإن التنفيذ مستمر | $ this-> throwonerror = false ؛ |
| $ conn1 | مثيل PDO. يمكنك تعيينه أو استخدامه مباشرة. | $ this-> conn1-> pdostatement (..) ؛ |
| $ TransactionOpen | صحيح إذا كانت المعاملة مفتوحة | if ($ this-> TransactionOpen) {...} ؛ |
| $ endonly | إذا كانت قاعدة البيانات في وضع قراءة فقط أم لا. إذا كان ذلك صحيحًا ، فيجب علينا تجنب الكتابة في قاعدة البيانات | $ this-> readOnly = true ؛ |
| $ logfile | اسم الملف الكامل لملف السجل. إذا كان فارغًا ، فلن يقوم بتخزين ملف سجل. يقتصر ملف السجل على 1 ميجابايت | $ this-> logfile = "/folder/file.log" ؛ |
| $ errortext | يخزن الخطأ الأخير. Runget و Begintry يعيد ضبطه | صدى $ this-> errorText ؛ |
| $ isthrow | تودو | $ this-> isthrow = ؛ |
| $ loglevel | أنه يشير إلى المستوى الحالي من السجل. 0 = لا يوجد سجل (للإنتاج) ، 3 = سجل كامل | $ this-> loglevel = 3 ؛ |
| $ lastquery | تم تنفيذ الاستعلام الأخير | صدى $ this-> lastQuery ؛ |
| $ lastparam | المعلمات الأخيرة. إنها مجموعة نقاطية | صدى $ this-> lastparam ؛ |
تسمح هذه المكتبة بالتشفير/فك تشفير المعلومات.
لتعيين التشفير ، يمكنك استخدام الأمر التالي:
$ this -> setEncryption ( 12345678 , '' , ' INTEGER ' ); // the type of encryption is integer and it only works with integers. It doesn't use a salt value
$ this -> setEncryption ( ' password ' , ' some-salt ' , ' AES-256-CTR ' ); // the password, the salt and the type of encryption (aes-256-ctr), you can use other methods
$ this -> setEncryption ( ' passwrd ' , '' , ' SIMPLE ' ); // the type of encryption is simple and it only works with primitive values. It doesn't use a salt.ثم يمكنك تشفير وفك تشفير قيمة باستخدام
$ encrypted = $ this -> encrypt ( $ original ); // encrypt $original
$ original = $ this -> decrypt ( $ encrypted ); // decrypt $encryptedمثال:
$ this -> setEncryption ( ' 12345 ' , ' salt-1234 ' ); // it will use AES-256-CTR, the password and the salt must be secret.
// create user
$ this -> set ([ ' username ' => 1 , ' password ' => $ this -> encrypt ( $ password )])
-> from ( ' user ' )
-> insert ();
// validate user
$ user = $ this -> select ([ ' username ' , ' password ' ])
-> from ( ' user ' )
-> where ([ ' username ' , ' password ' ],[ 1 , $ this -> encrypt ( $ password )])
-> first ();
// $user= if false or null then the user does not exist or the password is incorrect. يمكنك تعيين مستوى السجل على 3. يعمل مستوى السجل عندما تفشل العملية ، وكلما ارتفع مستوى السجل ، يعرض معظم المعلومات.
$ pdoOne -> logLevel = 3 ; // the highest for debug.بشكل افتراضي ، يرمي PDOONE أخطاء PHP ، ولكن يمكننا تجنب ذلك عن طريق تعيين الحقل $ throwonerror على خطأ.
$ pdoOne -> throwOnError = false ; // it could be used in production. var_dump ( $ pdoOne -> lastQuery ); // it shows the last query
var_dump ( $ pdoOne -> lastParam ); // and it shows the last parameters.إذا كان فارغًا ، فلن يقوم بإنشاء ملف سجل (باستخدام ملف سجل PHP)
$ pdoOne -> logFile = true ; يحتوي PDOONE على بعض الميزات المتوفرة فقط في CLI.

قم بتنفيذ السطر التالي (في مجلد LIB)
php pdoonecli.php
(أو الإشارة إلى المجلد الصحيح)
PHP/VAR/WEB/PANDOR/EFTEC/LIB/PDOONECLI
يمكنك استخدام العلم "-i" للدخول في الوضع التفاعلي.
يمكنك استخدام مفتاح علامة التبويب لإكمال القيم (إن وجدت).

ملاحظة: يمكنك أيضًا حفظ التكوين وتحميله.
الاتصال بـ MySQL وإنشاء CSV من الجدول "ممثل"
# # via arguments
php pdoonecli --databasetype mysql --server 127.0.0.1 -u root -p abc.123 --database sakila -in actor -out csv
# # via user input (interactive)
php pdoonecli -i -in actor -out csvاحفظ التكوين في ملف
php pdoonecli --databasetype mysql --server 127.0.0.1 -u root -p abc.123 --database sakila --saveconfig myconfigقم بتحميل التكوين من ملف
php pdoonecli --loadconfig myconfig -in actor -out csvيمكنك استخدام العلم "-CLI" لإنشاء فصول المستودع

CLI تفاعلي ، ويسمح بتحميل وحفظ التكوين.
ستولد الوظيفة فئة مستودع جاهزة للاستخدام.
دعنا نقول المثال التالي
MySQL:
php pdoone.php -database mysql -server 127.0.0.1:3306 -user root -p abc.123 -db sakila -input "Actor" -output classcode
SQLSRV:
php pdoone.php -database sqlsrv -server pcjc sqlexpress -user sa -p abc.123 -db sakila -input "ممثل" -رموز فئة Output
سيتم الاتصال بقاعدة البيانات MySQL و IP: 127.0.0.1 وقاعدة البيانات Sakila ، وسوف تقرأ جدول "الممثل".
ستعيد النتيجة التالية
/**
* Generated by PdoOne Version 1.28
* Class ActorRepo
*/
class ActorRepo
{
const TABLE = ' Actor ' ;
const PK = ' actor_id ' ;
/** @var PdoOne */
public static $ pdoOne = null ;
/**
* It creates a new table<br>
* If the table exists then the operation is ignored (and it returns false)
*
* @param array $definition
* @param null $extra
*
* @return array|bool|PDOStatement
* @throws Exception
*/
public static function createTable ( $ definition , $ extra = null ) {
if (! self :: getPdoOne ()-> tableExist ( self :: TABLE )) {
return self :: getPdoOne ()-> createTable ( self :: TABLE , $ definition , self :: PK , $ extra );
}
return false ; // table already exist
}
// .....
}ستقوم هذه الوظيفة بإنشاء فئة مستودع جديدة مع العمليات الأكثر شيوعًا: أدخل ، قائمة ، تحديث ، حذف ، الحصول على ، العد ، إنشاء جدول ، جدول قطرة وجدول مقطوع
لماذا نحتاج إلى توليد فصل؟ (بدلاً من الوراثة واحدة) فئة Crud هذه ليست سوى نقطة انطلاق. يمكن للمطور تعديل الكود وإضافة طرق جديدة وتعديل الطريقة السابقة وما إلى ذلك.
لاستخدام الفصل ، يمكننا كتابة الرمز التالي:
// 1) option 1, inject an instance of $pdo
ActorRepo:: setPdoOne ( $ pdoOne ); // it inject the current connect to the database
// 2) option 2.
// If the global variable $pdoOne exists, then it is injected. (unless it is defined by using setPdoOne()
$ pdoOne = new PdoOne ( " mysql " , " 127.0.0.1 " , " root " , " abc.123 " , " sakila " , "" );
$ pdoOne -> connect ();
// 3) option 3
// If the global function pdoOne() exists, then it is used for obtain the instance.
function pdoOne () {
global $ pdo ;
if ( $ pdo === null ) {
$ pdo = new PdoOne ( ' mysql ' , ' 127.0.0.1 ' , ' root ' , ' abc.123 ' , ' sakila ' );
}
return $ pdo ;
}
$ actorActorRepo :: get ( 2 ); // it will read the actor with the pk=2 and it will return as an array.
$ actors = $ actorArray =ActorRepo:: select (); // it returns all the rows.بدلاً من ذلك ، يمكنك إنشاء ملف PHP تلقائيًا على النحو التالي:
php pdoone.php -database mysql -Server 127.0.0.1:3306 -user root -pwd abc.123 -db sakila -inp
ملاحظة: يفتقر الرمز إلى علامات PHP ومساحة الاسم والاستخدام ولكن كل شيء آخر هنا.
سوف يستغرق الاستعلام وسوف يعيد رمز PHP مع تنسيق الاستعلام.
مثال:
php pdoone.php -database mysql -Server 127.0.0.1:3306 -user root -pwd ABC.123 -DB Sakila -inp
سوف يولد الرمز التالي:
/** @var array $result=array(["actor_id"=>0,"first_name"=>'',"last_name"=>'',"last_update"=>'']) */
$ result = $ pdo
-> select ( " * " )
-> from ( " actor " )
-> toList ();ستقوم بإنشاء صفيف نقابي (مع القيم الافتراضية) على أساس الاستعلام أو الجدول المحدد.
php pdoone.php -database mysql -Server 127.0.0.1:3306 -user root -pwd ABC.123 -DB Sakila -inp
ستعود:
// ["actor_id"=>0,"first_name"=>'',"last_name"=>'',"last_update"=>'']ستعيد نتيجة الاستعلام باعتباره JSON
php pdoone.php -database mysql -Server 127.0.0.1:3306 -user root -pwd ABC.123 -DB Sakila -inp
ستعود:
[{ "actor_id" : " 1 " , "first_name" : " PENELOPE " , "last_name" : " GUINESS " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 2 " , "first_name" : " NICK " , "last_name" : " WAHLBERG " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 3 " , "first_name" : " ED " , "last_name" : " CHASE " , "last_update" : " 2006-02-15 01:34:33 " }
,{ "actor_id" : " 4 " , "first_name" : " JENNIFER " , "last_name" : " DAVIS " , " last_update " }]ستعيد نتيجة الاستعلام باعتباره JSON
php pdoone.php -database mysql -Server 127.0.0.1:3306 -user root -pwd ABC.123 -DB Sakila -inp
ستعود:
actor_id,first_name,last_name,last_update
1,"PENELOPE","GUINESS","2006-02-15 01:34:33"
2,"NICK","WAHLBERG","2006-02-15 01:34:33"
3,"ED","CHASE","2006-02-15 01:34:33"
4,"JENNIFER","DAVIS","2006-02-15 01:34:33"
بدلاً من ذلك إلى CLI ، تحتوي المكتبة على واجهة مرئية. يفعل كل عملية CLI.

ما عليك سوى استدعاء طريقة عرض ()
<?php
use eftec PdoOne ;
use mapache_commons Collection ;
include " ../vendor/autoload.php " ;
$ dao = new PdoOne ( " test " , " 127.0.0.1 " , " dummy " , " dummy " , " dummy " ); // we need any connection.
$ dao -> logLevel = 3 ;
$ dao -> render ();هناك مثال في أمثلة المجلد/testui.php
عادة ما يتم تنفيذ الأوامر التالية بمفردها (وليس في سلسلة من الأساليب)
| طريقة | وصف | مثال |
|---|---|---|
| CreateTable () | ينشئ الجدول والفهارس باستخدام التعريف داخل الريبو | TableParentRepo :: CreateTable () ؛ |
| CreateForeGnkeys () | إنشاء جميع المفاتيح الأجنبية للجدول | TableParentRepo :: createForeGnkeys () ؛ |
| القابض () | إسقاط الجدول | TableParentRepo :: droptable () ؛ |
| Truncate () | اقتطاع الجدول | TableParentRepo :: Truncate () ؛ |
| alightable () | التحقق مما إذا لم يتغير الجدول | $ OK = TABAPARENTREPO :: appaltable () ؛ |
TablaParentRepo:: createTable ();
TablaParentRepo:: createForeignKeys ();
TablaParentRepo:: dropTable ();
TablaParentRepo:: truncate ();
// We don't have a method to alter a table.
$ ok =TablaParentRepo:: validTable (); // it returns true if the table matches with the definition stored into the clasالمشغلين المتداخلين هم طرق يجب أن تكون بين سلسلة أساليبنا.
classrepo :: op () :: Where () :: Finalop () ✅
classrepo :: op () :: op () :: Where () سوف يترك السلسلة مفتوحة
على سبيل المثال:
// select *
// from table
// inner join table2 on t1=t2
// where col=:arg
// and col2=:arg2
// group by col
// having col3=:arg3
// order by col
// limit 20,30
$ results = $ pdo -> select ( ' * ' )
-> from ( ' table ' )
-> innerjoin ( ' table2 on t1=t2 ' )
-> where ( ' col=:arg and col2:=arg2 ' ,[ 20 , 30 ])
// it also works with ->where('col=:arg',20)->where('col2'=>30)
// it also works with ->where('col=?',20)->where('col2=?'=>30)
-> group ( ' col ' )
-> having ( ' col3=:arg3 ' , 400 )
-> order ( ' col ' )
-> limit ( ' 20,30 ' )
-> toList (); // end of the chain| طريقة | وصف | مثال |
|---|---|---|
| أين() | يضيف أين السلسلة | TapparentRepo :: Where () |
| طلب() | يضيف طلبًا إلى السلسلة | TapparentRepo :: Order () |
| مجموعة() | يضيف مجموعة إلى السلسلة | TapparentRepo :: Group () |
| حد() | يحد من النتائج | TapparentRepo :: Limit () |
| صفحة() | يشبه الحد الأقصى ولكنه يستخدم الصفحة | TapparentRepo :: Page () |
| innerjoin () | يضيف انضمام داخلي إلى الاستعلام | TapparentRepo :: Innerjoin () |
| غادر() | يضيف انضمام يسار إلى الاستعلام | TapparentRepo :: Left () |
| يمين() | يضيف صلة يمينًا إلى الاستعلام | TapparentRepo :: Right () |
لدينا طرق مختلفة لإنشاء أمر DQL (استعلام) في قاعدة البيانات الخاصة بنا.
إذا فشلت العملية ، فإنهم يعيدون خطأ ، ويمكنهم تشغيل استثناء.
يجب أن تكون الأساليب التالية في نهاية السلسلة. أمثلة:
classrepo :: op () :: op () :: tolist () هو ✅
classrepo :: op () :: tolist () :: op () سوف يؤدي إلى استثناء
| يأمر | وصف | مثال |
|---|---|---|
| toleist () | يعيد مجموعة من العناصر | $ data = tablenamerepo :: tolist () ؛ // حدد * من TableRepo $ data = tablenamerepo :: أين ('a1 =؟' ، [$ value]) :: tolist () ؛ // حدد * من TableRepo حيث A1 = $ قيمة |
| أولاً() | يعيد صف بسيط | $ data = tablenamerepo :: first ($ pk) ؛ // حدد * من TableRepo حيث PK = $ PK (يعيد دائمًا 1 أو قيم صفر) $ data = tablenamerepo :: أين ('a1 =؟' ، [$ value]) :: first () ؛ // يعيد القيمة الأولى (أو خطأ إذا لم يتم العثور عليه) |
| يخرج() | يعود صحيح في حالة وجود مفتاح أساسي | $ data = tablenamerepo :: arug ($ pk) ؛ // إرجاع صحيح في حالة وجود الكائن. |
| عدد() | يعيد عدد الصفوف في الاستعلام | $ data = tablenamerepo :: count ($ ظروف) ؛ $ data = tablenamerepo :: أين ('a1 =؟' ، [$ value]) :: count () ؛ |
تتيح الطرق التالية إدخال القيم أو تحديثها أو حذفها في قاعدة البيانات.
| طريقة | وصف | مثال |
|---|---|---|
| أدخل | يدرج قيمة في قاعدة البيانات. يمكن أن تعيد الهوية | $ Identity = tablaparentRepo :: insert ($ OBJ) ؛ |
| تحديث | يقوم بتحديث قيمة في قاعدة البيانات. | TableParentRepo :: Update ($ OBJ) ؛ |
| يمسح | يحذف قيمة من قاعدة البيانات. | TableParentRepo :: Delete ($ OBJ) ؛ |
| deletebyid | يحذف قيمة (باستخدام المفتاح الأساسي كشرط) من قاعدة البيانات. | TableParentRepo :: deletebyid ($ pk) ؛ |
// where obj is an associative array or an object, where the keys are the name of the columns (case sensitive)
$ identity =TablaParentRepo:: insert ( $ obj );
TablaParentRepo:: update ( $ obj );
TablaParentRepo:: delete ( $ obj );
TablaParentRepo:: deleteById (id);من الممكن التحقق من صحة النموذج. يتم التحقق من صحة النموذج باستخدام معلومات قاعدة البيانات ، باستخدام نوع العمود ، والطول ، وإذا كانت القيمة تسمح فارغة وإذا كانت هوية (رقمية تلقائية).
$ obj =[ ' IdUser ' => 1 , ' Name ' ='John Doe'];
UserRepo:: validateModel ( $ obj , false ,[ ' _messages ' ]); // returns true if $obj is a valid User.الصفيف العودية عبارة عن مجموعة من الأوتار ذات القيم التي يمكن قراءتها أو الحصول عليها أو مقارنتها. على سبيل المثال ، للانضمام إلى جدول بشرط. لا يستخدمها PDOONE مباشرة ولكن _basepdoonerepo يستخدمه (_basepdoonerepo هو فئة تستخدم عندما ننشئ فئة خدمة مستودع تلقائيًا).
مثال
$ this -> select ( ' * ' )-> from ( ' table ' )-> recursive ([ ' table1 ' , ' table1.table2 ' ]);
// some operations that involves recursive
if ( $ this -> hasRecursive ( ' table1 ' )) {
$ this -> innerJoin ( ' table1 on table.c=table1.c ' );
}
if ( $ this -> hasRecursive ( ' table1.table2 ' )) {
$ this -> innerJoin ( ' table1 on table1.c=table2.c ' );
}
$ r = $ this -> toList (); // recursive is resetted. يضع صفيف العودية.
تتم إعادة ضبط هذه القيمة في كل مرة تنتهي فيها طرق السلسلة.
يحصل على الصفيف العودية.
إنه يعود صحيحًا إذا كان لدى العودية بعض الإبرة.
إذا كان $ this-> العودية ['*'] فهو يعيد دائمًا صحيحًا.
$ this -> select ( ' * ' )-> from ( ' table ' )-> recursive ([ ' * ' ]);
$ this -> hasRecursive ( ' anything ' ); // it always returns true. | مكتبة | أدخل | Findpk | هيدرات | مع | وقت |
|---|---|---|---|---|---|
| PDO | 671 | 60 | 278 | 887 | 3،74 |
| PDOONE | 774 | 63 | 292 | 903 | 4،73 |
| lessql | 1413 | 133 | 539 | 825 | 5،984 |
| يايم | 2260 | 127 | 446 | 1516 | 8،415 |
| yiimwithcache | 1925 | 122 | 421 | 1547 | 7،854 |
| yii2m | 4344 | 208 | 632 | 1165 | 11،968 |
| yii2marrayhydrate | 4114 | 213 | 531 | 1073 | 11،22 |
| yii2mscalarhydrate | 4150 | 198 | 421 | 516 | 9537 |
| propel20 | 2507 | 123 | 1373 | 1960 | 11،781 |
| propel20withcache | 1519 | 68 | 1045 | 1454 | 8228 |
| propel20formatondemand | 1501 | 72 | 994 | 1423 | 8228 |
| العجلة | 2119 | 250 | 1592 | 1258 | 18،139 |
| العجلة | 2084 | 243 | 1634 | 1155 | 17،952 |
| العجلة | 2137 | 240 | 1230 | 877 | 16،83 |
| العجلة | 2084 | 392 | 1542 | 939 | 18887 |
| ortinemwithoutproxies | 2119 | 252 | 1432 | 1960 | 19،822 |
| بليغ | 3691 | 228 | 708 | 1413 | 12155 |
يضيف PDOONE القليل من Ovehead على PDO ، ومع ذلك فهو بسيط غلاف إلى PDO.
هذا يعني أنه تم تحديث PDOONE ، وأنت تستخدم فئة واحدة تم إنشاؤها بواسطة ORM. يجب إعادة توليد هذه الفئة.
باختصار:
كل إصدار رئيسي يعني أنه يمكن أن يكسر الكود القديم. أي 1.0 -> 2.0
كل إصدار صغير يعني أنه يضيف وظيفة جديدة ، أي 1.5 -> 1.6 (طرق جديدة)
كل نسخة عشرية تعني أنها تصحيح/إصلاح/إعادة تهيئة وظيفة سابقة على سبيل المثال 1.5.0 -> 1.5.1 (إصلاح)
4.10 2024-09-06
4.9.2 2024-08-20
4.9.1 2024-08-20
4.9 2024-08-02
4.8 2024-07-06
4.7.1 2024-06-07
4.7 2024-06-07
4.6.2 2024-03-02
4.6.1 2024-03-02
4.6 2024-03-02
4.4 2023-12-12
4.3.3 2023-09-05
4.3.2 2023-09-05
4.3.1 2023-09-02
4.3 2023-07-01
4.2 2023-04-07
4.1.2 2023-03-21
4.1.1 2023-03-21
4.1 2023-03-20
4.0.1 2023-03-11
4.00 2023-11-03
3.16 2023-12-02
3.15 2023-02-03
3.14 2023-01-30
3.13 2023-01-26
3.12.2 2022-09-03
3.12.1 2022-08-26
3.12 2022-08-14
3.11.1 2022-07-30
3.11 2022-07-30
3.10 2022-07-30
3.9 2022-07-23
3.8.1 2022-07-23
3.8 2022-07-22
3.7 2022-07-16
3.6 2022-07-07
3.5 2022-07-06
3.3 2022-06-27
3.2 2022-06-27
3.1.6 2022-06-24
3.1.5 2022-06-23
3.1.4 2022-06-21
3.1.3 2022-06-18
3.1.2 2022-06-18
3.1.1 2022-06-17
3.1 2022-06-11
3.0 2022-06-1
2.32 2022-03-20
2.31 2022-03-04
2.30 2022-02-28
2.29 2022-02-20
2.27 2022-02-19
2.26 2022-02-19
2.25 2022-02-01
2.24.1 2022-02-06
2.24 2022-02-06
2.23 2022-02-04
2.22.2 2022-02-01
2.22.1 2022-01-03
2.22 2022-01-30
2.21 2022-01-28
However, it is far from perfect.
2.20 2022-01-04
2.19
2.18
2.16
2.15 2021-07-24
2.14.3 2021-06-15
2.14.2 2021-06-13
2.14.1 2021-06-09
2.14 2021-06-04
_BasePdoOneRepo now works more closely with the class PdoOneQuery , so each query is a different instance.
[fix] PdoOne dateConvertInput() does not crash when the value is not a date.
[fix] PdoOne throwError() does not stack errors but still triggers the last error (if any).
[changes] ❗ PdoOne aggregate functions (sum,min,max,avg) now returns a value instead of generating a query.
$result=$pdo->sum('xxx')->firstScalar(); // before $result=$pdo->sum('xxx'); // الآن
[fix] PdoOne generateCodeArray() used for the generation of classes, returns the correct name when it is set.
[changes] _BasePdoOneRepo : reset(),getQuery(),dropTable(),useCache(),limit(),newQuery(),order(),innerjoin(),left() ,right()
[changes] PdoOneQuery : Multiples changes.
2.13.1 2021-05-22
2.13 2021-04-17
2.12 2021-04-17
2.11.1 2021-04-17
2.11 2021-04-17
2.10.3 2021-04-14
2.10.2 2021-04-06
2.10.1 2021-04-05
2.10 2021-04-04
2.9.4 2021-03-22
2.9.3 2021-02-22
2.9.2 2021-02-18
2.9.1 2021-02-16
2.9 2021-02-16
2.8 2021-02-13
2.7.1 2021-01-21
2.7 2021-01-10
2.6.3 2020-10-16
2.6.2 2020-10-09
2.6.1 2020-09-24
2.6 2020-09-17
2.5 2020-09-13
2.4.1 2020-09-13
2.4 2020-09-06
2.3 2020-09-06
2.2.6 2020-09-03
2.2.5 2020-08-30
2.2.3 2020-08-23
2.2.2 2020-08-17
2.2.1 2020-08-16
2.2 2020-08-14
$ this -> setUseInternalCache ( true );
$ rows = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 1 ])-> toList (); // read from the database
// ...
$ rows2 = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 1 ])-> toList (); // read from memory
// ...
$ rows3 = $ this -> select ( ' * ' )-> from ( ' table ' )-> where ([ ' i ' => 2 ])-> toList (); // read from the database because the query is in
// memory but the parameters are different
echo $ this -> internalCacheCounter ; The internal cache is tested with runRawQuery (if returns an array), toList(), meta() and first()
2.0.1 2020-08-12
2.0 2020-08-11
1.55.1 2020-08-05
1.55 2020-8-05
1.54 2020-8-02
1.53 2020-7-27
1.52 2020-7-19
1.51 2020-7-18
1.50 2020-7-04
1.49 2020-6-19
1.48 2020-6-15
1.47 2020-6-14
1.46 2020-6-13
1.45.1 2020-6-11
1.45 2020-6-7
1.44.2 2020-6-3
1.44.1 2020-6-2
1.44 2020-5-31
1.43 2020-5-31
1.42 2020-5-29
1.41.2 2020-5-29
1.41.1 2020-5-28
1.41 2020-5-28
1.40.1 2020-5-27
1.40 2020-05-21
1.39 2020-05-12
1.38 2020-05-10
1.37 2020-05-03
1.36 2020-05-03
1.35.1 2020-04-30
1.35 2020-04-28
1.34.2 2020-04-27
1.34.1 2020-04-27
1.34 2020-04-27
1.33 2020-04-15
1.32.1 BasePdoOneRepo added version 2.0
1.32 2020-04-12
1.31.1 2020-04-11
1.31 2020-04-11
1.30 2020-04-10
1.29 2020-04-10
1.28.1 2020-04-06
1.28 2020-04-06
1.24 2020-03-26
1.23.1 2020-03-10
1.23 2020-03-10
1.22 2020-02-08
1.21 2020-02-07
1.20 2020-jan-25
1.19 2020-jan-15
1.16 2020-jan-14
1.15 2019-dec-29
1.14 2019-dec-26
1.13 2019-dec-26
1.12 2019-oct-20 Added argument (optional) ->toList($pdomodel) Added method ->toListSimple()
1.11 2019-oct-01 1.11 It is still compatible with php 5.6.Added to composer.json
1.10 2019-oct-01 1.10 Added method dateConvert(). Added trace to the throw.
1.9 2019-aug-10 1.8 republished
1.8 2019-aug-10 Added a date format. Methods dateSql2Text() and dateText2Sql()
1.7 2019-jun-23 Added some benchmark. It also solves a problem with the tags. Now: table.field=? is converted to table . field =?
1.6 2019-jun-22 affected_rows() returns a correct value.
1.5 2019-may-31 some cleanups. columnTable() returns if the column is nullable or not.
1.4 2019-may-30 insertobject()
1.3 2019-may-23 New changes
1.2 2019-may-22 New fixed.
1.1 2019-may-21 Some maintenance
1.0 2019-may-21 First version