MySQL හා සම්බන්ධ වීමට PHP විවිධ API තුනක් ඉදිරිපත් කරයි. මේවා mysql
(PHP 7 වන විට ඉවත් කර ඇත) mysqli
, සහ PDO
දිගු වේ.
මෙම mysql_*
කාර්යයන් ඉතා ජනප්රිය විය කිරීම සඳහා භාවිතා, නමුත් ඔවුන්ගේ භාවිතය තවදුරටත් දිරිමත් නැහැ. ප්රලේඛන කණ්ඩායම දත්ත සමුදායේ ආරක්ෂිත තත්ත්වය පිළිබඳව සාකච්ඡා කරමින් සිටින අතර බහුලව භාවිතා වන ext / mysql දිගුවෙන් ඉවත් වීමට පරිශීලකයින් දැනුවත් කිරීම මෙහි කොටසකි ( php.internals පරීක්ෂා කරන්න : ext / mysql අවලංගු කිරීම ).
සහ එහි පසු, PHP සංවර්ධක කණ්ඩායම ජනනය කිරීමට තීරණය කර තිබේ E_DEPRECATED
හරහා යන්න, පරිශීලකයන් MySQL වෙත සම්බන්ධ වන විට වැරදි mysql_connect()
, mysql_pconnect()
හෝ බවට ඉදි ගම්ය සම්බන්ධයක් ක්රියාකාරිත්වය ext/mysql
.
ext/mysql
විය නිල PHP 5.5 ක අදහසට විරුද්ධ ලෙස හා කර ඇත , PHP 7 ලෙස ඉවත් .
රතු කොටුව බලන්න?
ඔබ කිසියම් mysql_*
ක්රියාකාරී අත්පොත පිටුවකට ගිය විට, ඔබට රතු කොටුවක් පෙනේ, එය තවදුරටත් භාවිතා නොකළ යුතු බව පැහැදිලි කරයි.
මන්ද
එයින් ඉවත් ext/mysql
වීම ආරක්ෂාව ගැන පමණක් නොව, MySQL දත්ත ගබඩාවේ සියලුම අංග වෙත ප්රවේශය ලබා ගැනීම ද වේ.
ext/mysql
MySQL 3.23 සඳහා ගොඩනගා ඇති අතර එතැන් සිට එකතු කිරීම් කිහිපයක් පමණක් ලැබී ඇති අතර බොහෝ විට මෙම පැරණි අනුවාදය සමඟ අනුකූලතාව පවත්වා ගෙන යන අතර එමඟින් කේතය නඩත්තු කිරීම තරමක් අපහසු වේ. පහත දැක්වෙන අංග වලට සහය නොදක්වන අංග ext/mysql
ඇතුළත් වේ: ( PHP අත්පොතෙන් ).
mysql_*
ශ්රිතය භාවිතා නොකිරීමට හේතුව :
- ක්රියාකාරී සංවර්ධනය යටතේ නොවේ
- PHP 7 වන විට ඉවත් කර ඇත
- OO අතුරුමුහුණතක් නොමැත
- අවහිර නොකරන, අසමමුහුර්ත විමසුම් සඳහා සහය නොදක්වයි
- සකස් කළ ප්රකාශ හෝ පරාමිතිගත විමසුම් සඳහා සහය නොදක්වයි
- ගබඩා කළ ක්රියා පටිපාටිවලට සහය නොදක්වයි
- බහු ප්රකාශ සඳහා සහය නොදක්වයි
- ගනුදෙනු සඳහා සහාය නොදක්වයි
- MySQL 5.1 හි ඇති සියලුම ක්රියාකාරිත්වයට සහය නොදක්වයි
ක්වෙන්ටින්ගේ පිළිතුරෙන් උපුටා ගත් කරුණ
සකස් කරන ලද ප්රකාශ සඳහා සහය නොමැතිකම විශේෂයෙන් වැදගත් වන්නේ ඒවා වෙනම ක්රියාකාරී ඇමතුමකින් අතින් පැන යාමට වඩා පැහැදිලි, අඩු දෝෂ සහිත බාහිර දත්ත පැන යාම සහ උපුටා දැක්වීමකි.
SQL දිගු වල සංසන්දනය බලන්න .
ක්ෂයවීම් අනතුරු ඇඟවීම් යටපත් කිරීම
කේතය MySQLi
/ බවට පරිවර්තනය වන අතර PDO
, බැහැර කිරීම සඳහා php.ini හි E_DEPRECATED
සැකසීමෙන් දෝෂ යටපත් කළ හැකියerror_reporting
E_DEPRECATED:
error_reporting = E_ALL ^ E_DEPRECATED
මෙය වෙනත් ක්ෂයවීම් අනතුරු ඇඟවීම් ද සඟවනු ඇති බව සලකන්න , කෙසේ වෙතත්, MySQL හැර වෙනත් දේ සඳහා විය හැකිය. ( PHP අත්පොතෙන් )
PDO එදිරිව MySQLi ලිපිය : ඔබ භාවිතා කළ යුත්තේ කුමක්ද? විසින් Dejan Marjanovic ඔබ තෝරා ගැනීමට උපකාරී වනු ඇත.
වඩා හොඳ ක්රමයක් නම් PDO
, මම දැන් සරල PDO
නිබන්ධනයක් ලියමි.
සරල හා කෙටි PDO නිබන්ධනයක්
ප්රශ්නය - මගේ මනසේ මුල්ම ප්රශ්නය වූයේ: “පීඩීඕ” යනු කුමක්ද?
පිළිතුර - “ පීඩීඕ - පීඑච්පී දත්ත වස්තු - බහු දත්ත සමුදායන් වෙත ඒකාකාරී ප්රවේශයක් සපයන දත්ත සමුදා ප්රවේශ ස්ථරයකි.”
MySQL වෙත සම්බන්ධ වෙමින්
mysql_*
ක්රියාකාරීත්වය සමඟ හෝ අපට එය පැරණි ක්රමය ලෙස පැවසිය හැකිය (PHP 5.5 සහ ඊට ඉහළින් ඉවත් කර ඇත)
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('testdb', $link);
mysql_set_charset('UTF-8', $link);
සමග PDO
: ඔබ කළ යුත්තේ නව PDO
වස්තුවක් නිර්මාණය කිරීම පමණි . මෙම ඉදිකිරීමටත් දත්ත සමුදාය ප්රභවය නියම සඳහා පරාමිතීන් පිළිගන්නා PDO
ගේ ඉදිකිරීමටත් බොහෝ දුරට ලබන පරාමිති හතර ගනී DSN
(දත්ත ප්රභවය නම) විකල්පයක් හා username
, password
.
මෙන්න මම හිතන්නේ ඔබ හැර අන් සියල්ලන්ටම හුරුපුරුදු ය DSN
; මෙය අළුත් දෙයක් PDO
. A DSN
යනු මූලික වශයෙන් PDO
කුමන ධාවකය භාවිතා කළ යුතුද යන්න සහ සම්බන්ධතා තොරතුරු පවසන විකල්ප මාලාවකි. වැඩි විස්තර සඳහා PDO MySQL DSN පරීක්ෂා කරන්න .
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
සටහන: ඔබට ද භාවිතා කළ හැකිය charset=UTF-8
, නමුත් සමහර විට එය දෝෂයක් ඇති කරයි, එබැවින් එය භාවිතා කිරීම වඩා හොඳය utf8
.
කිසියම් සම්බන්ධතා දෝෂයක් තිබේ නම්, එය තවදුරටත් PDOException
හැසිරවීමට අල්ලා ගත හැකි වස්තුවක් විසි කරයි Exception
.
හොඳ කියවීම : සම්බන්ධතා සහ සම්බන්ධතා කළමනාකරණය
සිව්වන පරාමිතිය සඳහා අරාව ලෙස ඔබට ධාවක විකල්ප කිහිපයකින් සමත් විය හැකිය. PDO
ව්යතිරේක ප්රකාරයට ඇතුළත් වන පරාමිතිය සම්මත කිරීමට මම නිර්දේශ කරමි . සමහර PDO
රියදුරන් ස්වදේශික සූදානම් කළ ප්රකාශයන්ට සහාය නොදක්වන හෙයින් PDO
, සූදානම අනුකරණය කරයි. මෙම අනුකරණය අතින් සක්රීය කිරීමට ද එය ඔබට ඉඩ සලසයි. ස්වදේශීය සේවාදායකයේ සූදානම් කළ ප්රකාශ භාවිතා කිරීමට, ඔබ එය පැහැදිලිවම සැකසිය යුතුය false
.
අනෙක් කාරණය නම් MySQL
පෙරනිමියෙන් ධාවකයේ සක්රීය කර ඇති සූදානම් කිරීමේ අනුකරණය අක්රිය කිරීමයි, නමුත් PDO
ආරක්ෂිතව භාවිතා කිරීම සඳහා අනුකරණය කිරීම අක්රිය කළ යුතුය .
සූදානම් කිරීමේ අනුකරණය අක්රිය කළ යුත්තේ මන්දැයි මම පසුව පැහැදිලි කරමි. හේතුව සොයා ගැනීමට කරුණාකර මෙම ලිපිය පරීක්ෂා කරන්න .
එය භාවිතා කළ හැක්කේ MySQL
මා නිර්දේශ නොකරන පැරණි අනුවාදයක් භාවිතා කරන්නේ නම් පමණි .
ඔබට එය කළ හැකි ආකාරය පිළිබඳ උදාහරණයක් පහත දැක්වේ:
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8',
'username',
'password',
array(PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
PDO ඉදිකිරීමෙන් පසු අපට ගුණාංග සැකසිය හැකිද?
ඔව් , PDO ඉදිකිරීමෙන් පසුව අපට setAttribute
ක්රමවේදය සමඟ සමහර ගුණාංග සැකසිය හැකිය :
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8',
'username',
'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
හැසිරවීමේ දෝෂයකි
දෝෂ හැසිරවීම වඩාත් පහසු වේ PDO
වඩා mysql_*
.
භාවිතා කරන විට පොදු සිරිතක් mysql_*
වන්නේ:
//Connected to MySQL
$result = mysql_query("SELECT * FROM table", $link) or die(mysql_error($link));
OR die()
අපට එය හැසිරවිය නොහැකි බැවින් දෝෂය හැසිරවීමට හොඳ ක්රමයක් නොවේ die
. එය ස්ක්රිප්ට් එක හදිසියේම අවසන් කර සාමාන්යයෙන් ඔබේ අවසාන පරිශීලකයින්ට පෙන්වීමට අවශ්ය නොවන දෝෂය තිරය වෙත දෝංකාර දෙයි, සහ ලේවැකි හැකර්වරුන්ට ඔබේ ක්රමෝපාය සොයා ගැනීමට ඉඩ දෙන්න. විකල්පයක් ලෙස, දෝෂ වල mysql_*
ක්රියාකාරිත්වය සඳහා බොහෝ විට ශ්රිතවල ප්රතිලාභ අගයන් mysql_error () සමඟ ඒකාබද්ධව භාවිතා කළ හැකිය.
PDO
වඩා හොඳ විසඳුමක් ඉදිරිපත් කරයි: ව්යතිරේක. අප සමග ඕනෑම දෙයක් PDO
එතූ කළ යුතු try
- catch
වාරණ. PDO
දෝෂ මාදිලියේ ගුණාංගය සැකසීමෙන් අපට දෝෂ ක්රම තුනෙන් එකකට බල කළ හැකිය . දෝෂ හැසිරවීමේ ක්රම තුනක් පහතින්.
PDO::ERRMODE_SILENT
. එය හුදෙක් දෝෂ කේත සැකසීම පමණක් වන mysql_*
අතර ඔබ එක් එක් ප්රති result ලය පරික්ෂා කර බැලිය යුතු තැනට සමාන ලෙස ක්රියා කරයි $db->errorInfo();
.
PDO::ERRMODE_WARNING
ඔසවන්න E_WARNING
. (ධාවන කාල අනතුරු ඇඟවීම් (මාරාන්තික නොවන දෝෂ). පිටපත ක්රියාත්මක කිරීම නතර නොවේ.)
PDO::ERRMODE_EXCEPTION
: ව්යතිරේක විසි කරන්න. එය නියෝජනය කරන්නේ PDO විසින් මතු කරන ලද දෝෂයකි. ඔබ PDOException
ඔබේම කේතයෙන් විසි නොකළ යුතුය . PHP හි ව්යතිරේක පිළිබඳ වැඩි විස්තර සඳහා ව්යතිරේක බලන්න . එය or die(mysql_error());
හසු නොවූ විට එය බොහෝ සෙයින් ක්රියා කරයි . නමුත් මෙන් නොව or die()
, PDOException
ඔබ එසේ කිරීමට තෝරා ගන්නේ නම්, එය අල්ලාගෙන මනාව හැසිරවිය හැකිය.
හොඳ කියවීම :
මෙන්:
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
ඔබට එය ඔතා තැබිය හැකිය try
- catch
, පහත පරිදි:
try {
//Connect as appropriate as above
$db->query('hi'); //Invalid query!
}
catch (PDOException $ex) {
echo "An Error occured!"; //User friendly message/message you want to show to user
some_logging_function($ex->getMessage());
}
ඔබ සමඟ කටයුතු කළ යුතු නැත try
- catch
දැන්. ඔබට සුදුසු ඕනෑම වේලාවක එය අල්ලා ගත හැකිය, නමුත් භාවිතා කිරීමට මම තරයේ නිර්දේශ කරමි try
- catch
. එසේම එය PDO
දේවල් ලෙස හඳුන්වන ශ්රිතයට පිටතින් අල්ලා ගැනීම වඩාත් අර්ථවත් විය හැකිය :
function data_fun($db) {
$stmt = $db->query("SELECT * FROM table");
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
//Then later
try {
data_fun($db);
}
catch(PDOException $ex) {
//Here you can handle error and show message/perform action you want.
}
එසේම, ඔබට හැසිරවිය හැකිය, or die()
නැතහොත් අපට එසේ පැවසිය හැකිය mysql_*
, නමුත් එය සැබවින්ම වෙනස් වනු ඇත. display_errors off
ඔබේ දෝෂ ලොගය හැරවීම සහ කියවීමෙන් නිෂ්පාදනයේ ඇති භයානක දෝෂ පණිවිඩ සැඟවිය හැක .
දැන්, ඉහත සියලු දේ කියවීමෙන් පසු, ඔබට මීට හිතන්නේ: ද මන්දා මම සරල පක්ෂයට හේත්තු වී ආරම්භ කිරීමට අවශ්ය විට ඒ මොකක්ද SELECT
, INSERT
, UPDATE
, හෝ DELETE
ප්රකාශ? කණගාටු නොවන්න, මෙන්න අපි යමු:
දත්ත තෝරා ගැනීම
ඉතින් ඔබ කරන්නේ mysql_*
කුමක්ද:
<?php
$result = mysql_query('SELECT * from table') or die(mysql_error());
$num_rows = mysql_num_rows($result);
while($row = mysql_fetch_assoc($result)) {
echo $row['field1'];
}
දැන් PDO
, ඔබට මෙය කළ හැකිය:
<?php
$stmt = $db->query('SELECT * FROM table');
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['field1'];
}
හෝ
<?php
$stmt = $db->query('SELECT * FROM table');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
//Use $results
සටහන : ඔබ පහත ( query()
) වැනි ක්රමය භාවිතා කරන්නේ නම් , මෙම ක්රමය PDOStatement
වස්තුවක් ලබා දෙයි. එබැවින් ඔබට ප්රති result ලය ලබා ගැනීමට අවශ්ය නම්, ඉහත පරිදි එය භාවිතා කරන්න.
<?php
foreach($db->query('SELECT * FROM table') as $row) {
echo $row['field1'];
}
PDO දත්ත වලදී, එය ලබා ->fetch()
ගන්නේ ඔබේ ප්රකාශන හසුරුවීමේ ක්රමයක් මගිනි. ලබා ගැනීමට ඇමතීමට පෙර, හොඳම ප්රවේශය වනුයේ දත්ත ලබා ගැනීමට ඔබ කැමති ආකාරය PDO ට පැවසීමයි. පහත කොටසෙහි මම මෙය පැහැදිලි කරමි.
මාදිලි ලබා ගන්න
භාවිතය සටහන PDO::FETCH_ASSOC
තුළ fetch()
හා fetchAll()
ඉහත කේතය. PDO
ක්ෂේත්ර නාම යතුරු ලෙස අනුබද්ධ අරාව ලෙස පේළි ආපසු ලබා දීමට මෙය කියයි . තවත් බොහෝ ලබා ගැනීමේ ක්රම තිබේ, ඒවා එකින් එක පැහැදිලි කරමි.
පළමුවෙන්ම, ලබා ගැනීමේ මාදිලිය තෝරා ගන්නේ කෙසේදැයි මම පැහැදිලි කරමි:
$stmt->fetch(PDO::FETCH_ASSOC)
ඉහත, මම භාවිතා කර ඇත fetch()
. ඔබට මෙයද භාවිතා කළ හැකිය:
දැන් මම ලබා ගැනීමේ මාදිලිය වෙත පැමිණියෙමි:
PDO::FETCH_ASSOC
: ඔබේ ප්රති result ල කට්ටලයට අනුව තීරු නාමයෙන් සුචිගත කරන ලද අරාවක් ලබා දෙයි
PDO::FETCH_BOTH
(පෙරනිමිය): ඔබේ ප්රති result ල කට්ටලයට අනුව තීරු නම සහ 0-සුචිගත කළ තීරු අංකය යන දෙකෙන්ම සුචිගත කරන ලද අරාවක් ලබා දෙයි
ඊටත් වඩා තේරීම් තිබේ! ඒවා ගැන PDOStatement
ෆෙච් ප්රලේඛනයෙන් කියවන්න . .
පේළි ගණන ලබා ගැනීම :
mysql_num_rows
ආපසු ලබා දුන් පේළි ගණන ලබා ගැනීම සඳහා භාවිතා කරනවා වෙනුවට , ඔබට පහත PDOStatement
සහ rowCount()
වැනි දේ ලබා ගත හැකිය :
<?php
$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';
අවසන් වරට ඇතුළත් කළ හැඳුනුම්පත ලබා ගැනීම
<?php
$result = $db->exec("INSERT INTO table(firstname, lastname) VAULES('John', 'Doe')");
$insertId = $db->lastInsertId();
ප්රකාශ ඇතුළත් කිරීම සහ යාවත්කාලීන කිරීම හෝ මකා දැමීම
අප mysql_*
ක්රියාකාරීව කරන්නේ:
<?php
$results = mysql_query("UPDATE table SET field='value'") or die(mysql_error());
echo mysql_affected_rows($result);
Pdo හි දී, මෙයම කළ හැක්කේ:
<?php
$affected_rows = $db->exec("UPDATE table SET field='value'");
echo $affected_rows;
ඉහත විමසුමේදී PDO::exec
SQL ප්රකාශයක් ක්රියාත්මක කර බලපෑමට ලක් වූ පේළි ගණන නැවත ලබා දේ.
ඇතුළු කිරීම සහ මකා දැමීම පසුව ආවරණය කෙරේ.
ඉහත ක්රමය ප්රයෝජනවත් වන්නේ ඔබ විමසුමේ විචල්යය භාවිතා නොකරන විට පමණි. නමුත් විමසුමකදී ඔබට විචල්යයක් භාවිතා කිරීමට අවශ්ය වූ විට, සූදානම් කළ ප්රකාශයක් හෝ පරාමිතිගත ප්රකාශයක් සඳහා කිසි විටෙකත් ඉහත පරිදි උත්සාහ නොකරන්න .
සකස් කළ ප්රකාශ
ප්රශ්නය - සූදානම් කළ ප්රකාශයක් යනු කුමක්ද? මට ඒවා අවශ්ය වන්නේ ඇයි?
පිළිතුර - සූදානම් කළ ප්රකාශයක් යනු පෙර සම්පාදනය කරන ලද SQL ප්රකාශයකි, එය සේවාදායකයට දත්ත පමණක් යැවීමෙන් කිහිප වතාවක් ක්රියාත්මක කළ හැකිය.
සකස් කළ ප්රකාශයක් භාවිතා කිරීමේ සාමාන්ය කාර්ය ප්රවාහය පහත පරිදි වේ ( විකිපීඩියා තුනෙන් උපුටා ගත් කරුණු 3 ):
සකස් කරන්න : ප්රකාශන අච්චුව යෙදුම විසින් නිර්මාණය කර දත්ත සමුදා කළමනාකරණ පද්ධතියට (DBMS) යවනු ලැබේ. සමහර අගයන් නිශ්චිතව දක්වා නොමැති අතර පරාමිති, ස්ථාන දරන්නන් හෝ බන්ධන විචල්යයන් ලෙස හැඳින්වේ ( ?
පහත ලේබල් කර ඇත):
INSERT INTO PRODUCT (name, price) VALUES (?, ?)
ප්රකාශන අච්චුවේ DBMS විග්රහ කිරීම, සම්පාදනය කිරීම සහ විමසුම් ප්රශස්තිකරණය සිදු කරයි, ප්රති result ලය ක්රියාත්මක නොකර ගබඩා කරයි.
- ක්රියාත්මක කරන්න : පසුකාලීනව, යෙදුම පරාමිතීන් සඳහා අගයන් සපයයි (හෝ බන්ධනය කරයි), සහ ඩීබීඑම්එස් ප්රකාශය ක්රියාත්මක කරයි (සමහර විට ප්රති result ලයක් ලබා දෙයි). යෙදුම විවිධ අගයන් සමඟ ප්රකාශය අවශ්ය වාර ගණනක් ක්රියාත්මක කළ හැකිය. මෙම උදාහරණයේ දී, එය පළමු පරාමිතිය
1.00
සඳහා සහ දෙවන පරාමිතිය සඳහා 'පාන්' සැපයිය හැකිය .
ඔබේ SQL හි ස්ථාන දරන්නන් ඇතුළත් කිරීමෙන් ඔබට සූදානම් කළ ප්රකාශයක් භාවිතා කළ හැකිය. ස්ථාන හිමිකරුවන් නොමැතිව මූලික වශයෙන් තිදෙනෙක් සිටිති (ඉහත විචල්යයෙන් මෙය උත්සාහ නොකරන්න), එකක් නම් නොකළ ස්ථාන දරන්නන් සහ තවත් නම් කරන ලද ස්ථාන දරන්නන් සමඟ.
ප්රශ්නය - දැන්, ස්ථාන දරන්නන් ලෙස නම් කර ඇත්තේ කුමක්ද සහ මම ඒවා භාවිතා කරන්නේ කෙසේද?
පිළිතුර - ස්ථාන දරන්නන්. ප්රශ්න ලකුණු වෙනුවට මහා බඩවැලකට පෙර විස්තරාත්මක නම් භාවිතා කරන්න. නාම ස්ථාන දරන්නාගේ වටිනාකම / අනුපිළිවෙල ගැන අපි තැකීමක් නොකරමු:
$stmt->bindParam(':bla', $bla);
bindParam(parameter,variable,data_type,length,driver_options)
ක්රියාත්මක කිරීමේ අරාව භාවිතා කරමින් ඔබට බන්ධනය කළ හැකිය:
<?php
$stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
$stmt->execute(array(':name' => $name, ':id' => $id));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
OOP
මිතුරන් සඳහා ඇති තවත් හොඳ ලක්ෂණයක් නම් නම් කරන ලද ස්ථාන හිමියන්ට ඔබේ දත්ත ගබඩාවට කෙලින්ම වස්තු ඇතුළු කිරීමේ හැකියාව ඇති අතර, එම නම් නම් කරන ලද ක්ෂේත්රයන්ට ගැලපෙන ගුණාංග උපකල්පනය කරයි. උදාහරණයක් වශයෙන්:
class person {
public $name;
public $add;
function __construct($a,$b) {
$this->name = $a;
$this->add = $b;
}
}
$demo = new person('john','29 bla district');
$stmt = $db->prepare("INSERT INTO table (name, add) value (:name, :add)");
$stmt->execute((array)$demo);
ප්රශ්නය - දැන්, නම් නොකළ ස්ථාන දරන්නන් යනු කුමක්ද සහ මම ඒවා භාවිතා කරන්නේ කෙසේද?
පිළිතුර - අපි උදාහරණයක් කරමු:
<?php
$stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->bindValue(2, $add, PDO::PARAM_STR);
$stmt->execute();
සහ
$stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
$stmt->execute(array('john', '29 bla district'));
ඉහත සඳහන් ?
ස්ථානවල, නම ස්ථාන දරන්නා වැනි නමක් වෙනුවට ඒවා දැකිය හැකිය . දැන් පළමු උදාහරණයේ දී, අපි විවිධ ස්ථාන දරන්නන්ට විචල්යයන් ලබා දෙමු ( $stmt->bindValue(1, $name, PDO::PARAM_STR);
). ඉන්පසුව, අපි එම ස්ථාන හිමියන්ට අගයන් පවරා ප්රකාශය ක්රියාත්මක කරමු. දෙවන උදාහරණයේ දී, පළමු අරාව මූලද්රව්යය පළමු ?
හා දෙවන දෙවැන්න වෙත යයි ?
.
සටහන : නම් නොකල ස්ථාන දරන්නන් තුළ, අපි PDOStatement::execute()
ක්රමයට යන අරාවෙහි ඇති මූලද්රව්යයන්ගේ නිසි අනුපිළිවෙල ගැන සැලකිලිමත් විය යුතුය .
SELECT
, INSERT
, UPDATE
, DELETE
සූදානම් විමසුම්
SELECT
:
$stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
$stmt->execute(array(':name' => $name, ':id' => $id));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
INSERT
:
$stmt = $db->prepare("INSERT INTO table(field1,field2) VALUES(:field1,:field2)");
$stmt->execute(array(':field1' => $field1, ':field2' => $field2));
$affected_rows = $stmt->rowCount();
DELETE
:
$stmt = $db->prepare("DELETE FROM table WHERE id=:id");
$stmt->bindValue(':id', $id, PDO::PARAM_STR);
$stmt->execute();
$affected_rows = $stmt->rowCount();
UPDATE
:
$stmt = $db->prepare("UPDATE table SET name=? WHERE id=?");
$stmt->execute(array($name, $id));
$affected_rows = $stmt->rowCount();
සටහන:
කෙසේ වෙතත් PDO
සහ / හෝ MySQLi
සම්පූර්ණයෙන්ම ආරක්ෂිත නොවේ. පිළිතුර පරීක්ෂා කරන්න SQL එන්නත් කිරීම වැළැක්වීමට PDO සකස් කළ ප්රකාශ ප්රමාණවත්ද? ircmaxell විසින් . එසේම, මම ඔහුගේ පිළිතුරෙන් යම් කොටසක් උපුටා දක්වමි:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->query('SET NAMES GBK');
$stmt = $pdo->prepare("SELECT * FROM test WHERE name = ? LIMIT 1");
$stmt->execute(array(chr(0xbf) . chr(0x27) . " OR 1=1 /*"));