PDO ကိုသုံးရန်လိုအပ်ပါကပထမခြေလှမ်းမှာ DSN (Data source name) ကိုမှန်ကန်စွာရေးသားရန်ဖြစ်သည်။ ဤဆောင်းပါးသည် DSN syntax, လွယ်ကူသော---to-to-to-database များ၏အကောင်းဆုံးအလေ့အကျင့်များကိုစနစ်တကျစီစဉ်ထားသည်။
DSN : မည်သည့် Driver (MySQL, PGSQL, SQLite ... ), မည်သည့်အိမ်ရှင်, မည်သည့်အိမ်ရှင်, မည်သည့်အိမ်ရှင်, မည်သည့်အိမ်ရှင်, မည်သည့်အိမ်ရှင်, မည်သည့်အိမ်ရှင်နှင့်အခြားဆက်သွယ်မှုသတ်မှတ်ချက်များကိုဆက်သွယ်ရန်
တည်နေရာ - PDO အသစ် ($ DSN, $ username, $ password, $ ရွေးစရာများ)
ဖွဲ့စည်းပုံ : <driver>: <key> = <value>; [<key> = <key>: <key> <value>; ... ]
ဖြစ်ရပ်မှန် sensitivity : ကားမောင်းသူအမည်များနှင့်အဓိကအမည်များသည်များသောအားဖြင့်စာလုံးအကြီးအသေးအရေးမကြီးပါ။ သို့သော် တန်ဖိုးသည် (ထိုကဲ့သို့သောဖိုင်လမ်းကြောင်းများကဲ့သို့) ကွဲပြားခြားနားသည်။
အခြေစိုက်စခန်း:
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'mysql:host=127.0.0.1;port=3306;dbname=app;charset=utf8mb4'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>, [
PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span> => PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>,
]);
</span></span>အရေးကြီးသောအချက်များနှင့်ရွေးချယ်စရာများ:
Host : ဒိုမိန်းအမည် / IP ရနိုင်သည်။ သင် Unix Socket သို့သွားလျှင် Unix_socket = / Path / MySQL.SCOK ကို သုံးပါ။ အိမ်ရှင် / port ကိုထပ်မံ မ ရေးပါနှင့်။
DBNAME : ပစ်မှတ်ဒေတာဘေ့စ်အမည်။
Charset : UTF8MB4 ကိုသတ်မှတ်ရန်အထူးအကြံပြုလိုပါသည်။
Port : ချန်လှပ်ထားနိုင်သည်။ ပုံမှန် 3306 ဖြစ်သည်။
SSL : MySQL / driver ၏မူကွဲအသစ်ကို PDO :: MySQL_ATTR_SSL_ * option ကိုပေါင်းစပ်နိုင်သည်။
Unix Societ Sexpress:
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=app;charset=utf8mb4'</span></span><span>;
</span></span>Multi-parametering splicing အတွက်လုံခြုံစိတ်ချရသောနည်းလမ်း (Semi-colon / အထူးအက္ခရာများ) အတွက်လုံခြုံစိတ်ချရသောနည်းလမ်း:
<span><span><span class="hljs-variable">$params</span></span><span> = [
</span><span><span class="hljs-string">'host'</span></span><span> => </span><span><span class="hljs-string">'db.internal'</span></span><span>,
</span><span><span class="hljs-string">'port'</span></span><span> => </span><span><span class="hljs-number">3306</span></span><span>,
</span><span><span class="hljs-string">'dbname'</span></span><span> => </span><span><span class="hljs-string">'app'</span></span><span>,
</span><span><span class="hljs-string">'charset'</span></span><span> => </span><span><span class="hljs-string">'utf8mb4'</span></span><span>,
];
</span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'mysql:'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">';'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(
fn(</span><span><span class="hljs-variable">$k</span></span><span>,</span><span><span class="hljs-variable">$v</span></span><span>) => </span><span><span class="hljs-variable">$k</span></span><span> . </span><span><span class="hljs-string">'='</span></span><span> . </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">';'</span></span><span>, </span><span><span class="hljs-string">'\;'</span></span><span>, (</span><span><span class="hljs-keyword">string</span></span><span>)</span><span><span class="hljs-variable">$v</span></span><span>),
</span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$params</span></span><span>),
</span><span><span class="hljs-variable">$params</span></span><span>
));
</span></span>အခြေစိုက်စခန်း:
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'pgsql:host=127.0.0.1;port=5432;dbname=app'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>အဓိကအချက်များ
အိမ်ရှင်သည် လမ်းကြောင်းတစ်ခုဖြစ်နိုင်သည် (UNIX ဒိုမိန်း socke directory, များသောအားဖြင့် / var / run / postgresql ) နှင့် port ကို ဤအချိန်တွင်ချန်လှပ်နိုင်သည်။
ရွေးချယ်စရာများ သို့မဟုတ်ဆက်သွယ်မှုပြီးနောက်အမည်များကိုသတ်မှတ်ရန်သို့မဟုတ် Options = '- client_encoding = utf8' ကိုအသုံးပြုပြီး နောက်အမည်များကို သတ်မှတ်ရန်စာလုံးအစုကိုအကြံပြုသည်။
အချို့သောအခြေအနေများသည် host = / var / run / postgresql ၏အရေးအသားနည်းလမ်းကိုပိုနှစ်သက်သည်။
Unix Societ Sexpress:
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">"pgsql:host=/var/run/postgresql;dbname=app"</span></span><span>;
</span></span>ဖိုင်ဒေတာဘေ့စ် -
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'sqlite:/path/to/database.sqlite'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>);
</span></span>In-Memory Database:
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'sqlite::memory:'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>);
</span></span>အဓိကအချက်များ
လမ်းကြောင်းသည်နေရာများသို့မဟုတ် semicolons များပါ 0 င်သည့်အခါအမှန်တကယ်ဖိုင်လမ်းကြောင်းရှိအထူးအက္ခရာများကိုရှောင်ရှားရန်အကြံပြုသည်။ Windows အောက်ရှိနှစ်ဆ backslashes သို့မဟုတ်မျဉ်းစောင်းလမ်းကြောင်းများကိုအသုံးပြုပါ။ C: \\ ဒေတာ \\ db.sqlite သို့မဟုတ် c: /data/db.sqlite ။
အခြေစိုက်စခန်း:
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'sqlsrv:Server=127.0.0.1,1433;Database=app'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>အဓိကအချက်များ
ဆာဗာသည် အိမ်ရှင်, port သို့မဟုတ် hostname ၏ hostname \ တွင် ရေးနိုင်သည်။
Options မှတစ်ဆင့် encoding ကိုရွေးချယ်ရန်အကြံပြုသည်။ PDO :: sqlsrv_at_encoding ။
tls / encryption ကိုများသောအားဖြင့်ယာဉ်မောင်းရွေးချယ်မှုများဖြင့်ဖြတ်သန်းလေ့ရှိသည် (ဆောင်းပါး၏အဆုံးကိုကြည့်ပါ) ။
ပုံဖော်ထားသောဥပမာများ -
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'sqlsrv:Server=WIN-SRV\\SQLEXPRESS;Database=app'</span></span><span>;
</span></span>အခြေစိုက်စခန်း:
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'oci:dbname=//127.0.0.1:1521/ORCL;charset=AL32UTF8'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>အဓိကအချက်များ
DBNAME သည် // host: port / service_name သို့မဟုတ် local tnsnames.ora တွင်နာမည်များကိုထောက်ပံ့သည်။
အကြံပြု al32utf8 encoding ။
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=APP;HOSTNAME=127.0.0.1;PORT=50000;PROTOCOL=TCPIP;'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span> <span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'firebird:dbname=localhost:/path/to/db.fdb;charset=UTF8'</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span></span>အသေးစိတ်ဖော်ပြချက်: <driver>: key = တန်ဖိုး; key = တန်ဖိုး , semicolon, semicolon ဖြစ်ပါတယ်။
အကယ်. တန်ဖိုးမှာ Semicolon (ရှားပါး) ဆံ့နိုင်ပါက၎င်းကို DSN ထဲသို့ထည့်ရန် မ လိုအပ်ပါက၎င်းကို DSN ထဲသို့ထည့်ရန်မလိုအပ်ပါ။
MySQL - DSN တွင် Charset = UTF8MB4 ကို ထည့်ရန်အလိုအလျောက်ထည့်သွင်းထားပါသည်။ မိတ္တူပွားခြင်းကိုရှောင်ရှားရန်ချိတ်ဆက်ပြီးနောက် နာမည် မ တင်ပါနှင့်။
Postgresql - ရွေးစရာများ ဖြင့် UTF8 ကို ရွေးချယ်ရန် အကြံပြုသည်။
SQL server : option pdo :: sqlsrv_att_att_encoding (ဥပမာ sqlsrv_encoding_utf8 ) ကိုသတ်မှတ်ပါ။
MySQL တွင် Unix_socket နှင့် host / port ကို မသုံးပါနှင့် ။
Postgresql ၏ socket ကို directory တစ်ခုသို့ ညွှန် ပြခြင်းဖြင့်အကောင်အထည်ဖော်သည်။
Sqlite ကဲ့သို့သောဖိုင်လမ်းကြောင်းများကို Windows တွင်နှစ်ဆဖောက်ထွင်းခြင်းသို့မဟုတ်ရှေ့သို့မျဉ်းစောင်းများကိုအသုံးပြုရန်အကြံပြုသည်။ C: \\ pathsqlite သို့မဟုတ် c: / whatsp.sqlite ။
အကောင့်စကားဝှက်ကိုဂိုဒေါင်ထဲထည့်ပါ။
.NIV : DB_DSN = MYSQL: host = ... ; dbname = ... ; charset = utset = utset = utset = utset = utset = utset = utset = utset = utset =
Runtime: $ PDO = PDO အသစ် (DB_DSN), GetNV (DB_USER '), GetNV (DB_ass'),
<span><span><span class="hljs-variable">$opts</span></span><span> = [
PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span> => PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>, </span><span><span class="hljs-comment">// ခြွင်းချက်ပစ်,နေရာချထားရန်လွယ်ကူသည်</span></span><span>
PDO::</span><span><span class="hljs-variable constant_">ATTR_DEFAULT_FETCH_MODE</span></span><span> => PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>, </span><span><span class="hljs-comment">// default အားဖြင့် Associative Array ကိုပြန်ပို့သည်</span></span><span>
PDO::</span><span><span class="hljs-variable constant_">ATTR_EMULATE_PREPARES</span></span><span> => </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-comment">// ကားမောင်းသူကို preprocessing ကိုသုံးပါစေ(လုံခွုံမှု/ပိုပြီးတည်ငြိမ်သောစွမ်းဆောင်ရည်)</span></span><span>
];
</span><span><span class="hljs-comment">// MySQL SSL နမူနာ(ဘယ်အချိန်မှာယာဉ်မောင်းထောက်ခံမှု):</span></span><span>
</span><span><span class="hljs-variable">$opts</span></span><span>[PDO::</span><span><span class="hljs-variable constant_">MYSQL_ATTR_SSL_CA</span></span><span>] = </span><span><span class="hljs-string">'/etc/ssl/certs/ca.pem'</span></span><span>;
</span><span><span class="hljs-comment">// $opts[PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] = false; // သငျသညျစိစစ်အတည်ပြု skip ဖို့လိုအပ်မယ်ဆိုရင်(မအကြံပြုပါ)</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$pass</span></span><span>, </span><span><span class="hljs-variable">$opts</span></span><span>);
</span></span>အရိပ်အမြွက်:
ကြိုတင်မဆိုထုတ်ပြန်ချက်များနှင့်အတူပေါင်းစပ်နိုင်သလား ? သို့မဟုတ် SQL Injection ကိုရှောင်ရှားရန် paraywers အမည်ရှိ။
ထုတ်လုပ်မှုပတ် 0 န်းကျင်သည် TLS / SSL ကိုဖွင့်ထားရမည်။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">build_mysql_dsn</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">array</span></span></span><span> </span><span><span class="hljs-variable">$cfg</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-comment">// ထောက် host/port သို့မဟုတ် unix_socket,အချည်းနှီးသောတန်ဖိုးများကိုအလိုအလျောက်စစ်</span></span><span>
</span><span><span class="hljs-variable">$parts</span></span><span> = [];
</span><span><span class="hljs-variable">$parts</span></span><span>[] = </span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'unix_socket'</span></span><span>])
? </span><span><span class="hljs-string">'unix_socket='</span></span><span> . </span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'unix_socket'</span></span><span>]
: </span><span><span class="hljs-string">'host='</span></span><span> . (</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'host'</span></span><span>] ?? </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'unix_socket'</span></span><span>]) && !</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'port'</span></span><span>])) {
</span><span><span class="hljs-variable">$parts</span></span><span>[] = </span><span><span class="hljs-string">'port='</span></span><span> . (</span><span><span class="hljs-keyword">int</span></span><span>)</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'port'</span></span><span>];
}
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'dbname'</span></span><span>])) {
</span><span><span class="hljs-variable">$parts</span></span><span>[] = </span><span><span class="hljs-string">'dbname='</span></span><span> . </span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'dbname'</span></span><span>];
}
</span><span><span class="hljs-variable">$parts</span></span><span>[] = </span><span><span class="hljs-string">'charset='</span></span><span> . (</span><span><span class="hljs-variable">$cfg</span></span><span>[</span><span><span class="hljs-string">'charset'</span></span><span>] ?? </span><span><span class="hljs-string">'utf8mb4'</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">'mysql:'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">';'</span></span><span>, </span><span><span class="hljs-variable">$parts</span></span><span>);
}
</span><span><span class="hljs-comment">// အသုံးရောင်</span></span><span>
</span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-title function_ invoke__">build_mysql_dsn</span></span><span>([
</span><span><span class="hljs-string">'host'</span></span><span> => </span><span><span class="hljs-string">'db.internal'</span></span><span>,
</span><span><span class="hljs-string">'port'</span></span><span> => </span><span><span class="hljs-number">3306</span></span><span>,
</span><span><span class="hljs-string">'dbname'</span></span><span> => </span><span><span class="hljs-string">'app'</span></span><span>,
</span><span><span class="hljs-string">'charset'</span></span><span> => </span><span><span class="hljs-string">'utf8mb4'</span></span><span>,
]);
</span><span><span class="hljs-comment">// new PDO($dsn, $user, $pass, $opts);</span></span><span>
</span></span>Driver ကို install မလုပ်နိုင်ပါ - PDO_MYSQL / PDOMSQL / PDO_PGSQL ရှိလား ။
Host (သို့) Port Error : SQLTATE [2002] [2002] [2002] (MySQL) (MySQL) → Host / Port သို့မဟုတ် Unix_Socket ကို အတည်ပြုပါ။
ဒေတာဘေ့စ်မရှိပါ ။ အမည်မသိ database 'xxx' → dbname → dbname ကို fix သို့မဟုတ်စာကြည့်တိုက်ကိုအရင်ဖန်တီးပါ။
coding ပြ problem နာ - carbled code ပေါ်လာသော→ DSN / option ရှိဇာတ်ကောင်အစုံသည်တသမတ်တည်းရှိကြောင်းအတည်ပြုပါ ။
TLS / Certificate : SSL လက်ကိုင်တင်ခြင်းမအောင်မြင်ပါ။ tls ကိုဆာဗာတွင်ဖွင့်ထားသလား, CA လမ်းကြောင်းကိုစစ်ဆေးပါ။
ခွင့်ပြုချက်မလုံလောက်ခြင်း - ခွင့်ပြုချက်ငြင်းပယ်ခြင်း ငြင်းပယ်ခြင်းငြင်းပယ်ခြင်း accied →အသုံးပြုသူအမည် / စကားဝှက်, အသုံးပြုသူခွင့်ပြုချက်များကိုပစ်မှတ်စာကြည့်တိုက်တွင်အတည်ပြုပါ။
<span><span>MySQL
mysql:host=HOST;port=3306;dbname=DB;charset=utf8mb4
mysql:unix_socket=/path/mysql.sock;dbname=DB;charset=utf8mb4
PostgreSQL
pgsql:host=HOST;port=5432;dbname=DB
pgsql:host=/var/run/postgresql;dbname=DB
SQLite
sqlite:/absolute/path/to/db.sqlite
sqlite::memory:
SQL Server
sqlsrv:Server=HOST,1433;Database=DB
sqlsrv:Server=HOST\INSTANCE;Database=DB
Oracle
oci:dbname=//HOST:1521/SERVICE;charset=AL32UTF8
Db2
ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=DB;HOSTNAME=HOST;PORT=50000;PROTOCOL=TCPIP;
Firebird
firebird:dbname=HOST:/path/to/db.fdb;charset=UTF8
</span></span>
သက်ဆိုင်သောတက်(ဂ်)များ:
PDO