Сіз өнімдірек ететін өрнектерді дайындау және нысандармен жұмыс істеу әдістерін ұсынады!

PDO-ға кіріспе

«PDO – PHP деректер нысандары – әртүрлі дерекқорларға қол жеткізудің бірыңғай әдістерін қамтамасыз ететін дерекқорға қол жеткізу деңгейі».

Ол нақты дерекқор синтаксисіне сүйенбейді және көп жағдайда қосылым жолын өзгерту арқылы басқа дерекқор түріне және платформасына оңай ауысуға мүмкіндік береді.

Бұл сабақ жұмыс процесінің сипаттамасы емес SQL. Ол кеңейтімдерді пайдаланатындарға арналған mysqlнемесе mysqliқуатты және портативті PDO-ға көшуге көмектесу.

Мәліметтер базасын қолдау

Кеңейтім PDO драйвері бар кез келген дерекқорды қолдайды. Драйверлер қазіргі уақытта келесі дерекқор түрлері үшін қол жетімді:

  • PDO_DBLIB (FreeTDS / Microsoft SQL Server / Sybase)
  • PDO_FIREBIRD (Firebird/Interbase 6)
  • PDO_IBM (IBM DB2)
  • PDO_INFORMIX (IBM Informix динамикалық сервері)
  • PDO_MYSQL (MySQL 3.x/4.x/5.x)
  • PDO_OCI (Oracle қоңырау интерфейсі)
  • PDO_ODBC (ODBC v3 (IBM DB2, unixODBC және win32 ODBC))
  • PDO_PGSQL (PostgreSQL)
  • PDO_SQLITE (SQLite 3 және SQLite 2)
  • PDO_4D (4D)

Жүйе жұмыс істеуі үшін шынымен қажет драйверлерді ғана орнату жеткілікті. Жүйеде қол жетімді драйверлердің тізімін келесідей алуға болады:

Print_r(PDO::getAvailableDrivers());

Байланыс

Әртүрлі дерекқорларда сәл өзгеше қосылу әдістері болуы мүмкін. Бірнеше танымал дерекқорларға қосылу әдістері төменде көрсетілген. Алғашқы үшеуі бір-біріне ұқсайтынын және тек SQLite-де арнайы синтаксис бар екенін байқайсыз.


көріңіз ( # MS SQL сервері және PDO_DBLIB бар Sybase $DBH = жаңа PDO("mssql:host=$host;dbname=$dbname, $user, $pass"); $DBH = жаңа PDO("sybase:host=$хост" ;dbname=$dbname, $user, $pass"); # PDO_MYSQL бар MySQL $DBH = жаңа PDO("mysql:host=$host;dbname=$dbname", $user, $pass); # SQLite $DBH = new PDO("sqlite:my/database/path/database.db"); ) catch(PDOException $e) ( echo $e->getMessage(); )

Блокқа назар аударыңыз көріңіз/ұстаңыз- әрқашан PDO операцияларын блокқа орау керек көріңіз/ұстаңызжәне ерекшелік механизмін пайдаланыңыз. Әдетте бір ғана қосылым жасалады, біздің мысал синтаксисті көрсету үшін бірнеше қосылымдарды көрсетеді. $DBHдерекқор дескрипторын қамтиды және біздің оқулықта қолданылады.

Тұтқаны параметріне орнату арқылы кез келген қосылымды жабуға болады null.

# Қосылымды жабу $DBH = null;

PHP.net құжаттарынан әртүрлі дерекқорларға арналған арнайы опциялар мен қосылым жолдары туралы көбірек біле аласыз.

Ерекшеліктер және PDO

PDO қателерді өңдеу үшін ерекше жағдайларды пайдалана алады. Бұл барлық PDO операциялары блокта болуы керек дегенді білдіреді көріңіз/ұстаңыз. PDO қателердің үш деңгейін шығара алады, қатені басқару деңгейі дерекқор дескрипторы үшін қатені басқару режимінің төлсипатын орнату арқылы таңдалады:

$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Басқару деңгейінің орнатылғанына қарамастан, қосылым қатесі әрқашан ерекше жағдайды тудырады және сондықтан әрқашан блокта болуы керек көріңіз/ұстаңыз.

PDO::ERRMODE_SILENT

Қатені басқару деңгейі әдепкі бойынша орнатылады. Бұл деңгейде қателер кеңейтімдердегі сияқты принцип бойынша жасалады mysqlнемесе mysqli. Қатені басқарудың қалған екі деңгейі DRY (Өзіңізді қайталамаңыз) бағдарламалау стилі үшін қолайлырақ.

PDO::ERRMODE_WARNING

Қателерді басқарудың бұл деңгейінде стандартты PHP ескертулері жасалады және бағдарлама орындауды жалғастыра алады. Бұл деңгей жөндеуге ыңғайлы.

PDO::ERRMODE_EXCEPTION

Қателерді басқарудың бұл деңгейі көптеген жағдайларда қолданылуы керек. Ерекшеліктер қателерді мұқият өңдеу және жүйеңізді бұзуға көмектесетін деректерді жасыру үшін жасалады. Төменде ерекше жағдайлардың артықшылықтарын көрсететін мысал келтірілген:

# Дерекқорға қосылып көріңіз ( $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) ; # ТАҢДАУ орнына DELECT теру қате! $DBH->prepare("Адамдардан атын ЖОЮ"); ) catch(PDOException $e) ( echo "Кешіріңіз. Бірақ операцияны орындау мүмкін болмады."; file_put_contents("PDOErrors. txt" , $e->getMessage(), FILE_APPEND); )

Мұнда SELECT мәлімдемесінде әдейі қате бар. Бұл ерекше жағдайды тудырады. Ерекшелік журнал файлына қатенің сипаттамасын жібереді және пайдаланушыға хабарды көрсетеді.

Деректерді енгізу және жаңарту

Жаңа деректерді енгізу немесе бар деректерді жаңарту ең жиі қолданылатын дерекқор операцияларының бірі болып табылады. PDO пайдалану кезінде ол екі кезеңге ыдырайды. Осы тарауда сипатталғанның барлығы екі операцияға да қатысты. ЖАҢАРТУЖәне INSERT.


Мұнда ең көп қолданылатын деректерді енгізу түрінің мысалы келтірілген:

# STH - "күй дескрипторы" $STH = $DBH->prepare("INSERT INTO folks (first_name) мәндері ("Кэти")"); $STH->execute();

Әрине, бұл әрекетті әдіс арқылы орындауға болады exec(), ал қоңыраулар саны бір кем болады. Бірақ дайындалған өрнектердің пайдасын алу үшін ұзағырақ әдісті қолданған дұрыс. Оларды тек бір рет пайдаланғыңыз келсе де, дайындалған өрнектер жүйеңізге шабуылдардан қорғауға көмектеседі.

Дайындалған өрнектер

Дайындалған мәлімдемелер серверге тек деректерді жіберу арқылы бірнеше рет орындалатын алдын ала құрастырылған SQL операторлары. Олардың SQL коды тіркемелері арқылы шабуылдардан қорғау түріндегі деректермен үлгіні автоматты түрде толтырудың қосымша артықшылығы бар.

Үлгілерді SQL кодыңызға қосу арқылы дайындалған өрнектерді пайдалануға болады. Төменде 3 мысал келтірілген: біреуі үлгілері жоқ, біреуі аты жоқ үлгілері бар, біреуі атаулы үлгілері бар.

# шаблондар жоқ - SQL инъекциялық шабуылдарына ашық! $STH = $DBH->("INSERT INTO folks (аты, мекенжайы, қаласы) мәндерін ($name, $addr, $city)"); # атаусыз үлгілер $STH = $DBH->("INSERT INTO folks (аты, мекенжайы, қала) мәндері (?, ?, ?); # аталған үлгілер $STH = $DBH->("INSERT INTO folks (аты) , addr , city) мәні (:name, :addr, :city)");

Бірінші әдісті пайдаланудан аулақ болу керек. Атаулы немесе аталмаған үлгілерді таңдау осы өрнектер үшін деректерді орнату жолына әсер етеді.

Аты жоқ үлгілер # әрбір үлгіге айнымалы мәндерді тағайындайды, 1-ден 3-ке дейін индекстелген $STH->bindParam(1, $name); $STH->bindParam(2, $addr); $STH->bindParam(3, $city); # Бір жолды енгізу $name = "Дима" $addr = "Лизюкова көш."; $city = "Мәскеу"; $STH->execute(); # Басқа жолды кірістіру $name = "Сеня" $addr = "Коммунистік тығырыққа тірелу"; $city = "Питер"; $STH->execute();

Операция екі кезеңде өтеді. Бірінші қадамда айнымалылар үлгілерге тағайындалады. Содан кейін айнымалыларға мәндер тағайындалады және өрнек орындалады. Деректердің келесі бөлігін жіберу үшін айнымалылардың мәндерін өзгертіп, өрнекті қайта іске қосу керек.

Параметрлері көп өрнектер үшін біршама қиын болып көрінеді ме? Әрине. Дегенмен, деректеріңіз массивте сақталса, бәрі өте қысқа болады:

# Енгізілетін деректер $data = array("Monya", "Forget-me-Not Avenue", "Закутайск"); $STH = $DBH->("INSERT INTO folks (аты, мекенжайы, қаласы) мәндерін (?, ?, ?)"); $STH->орындау($деректер);

Жиымдағы деректер үлгілерге олардың пайда болу ретімен ауыстырылады. $деректер бірінші үлгіге, $деректер екіншісіне және т.б. Алайда, егер массив басқа ретпен индекстелсе, онда мұндай операция дұрыс орындалмайды. Үлгілердің реті массивтегі деректер ретіне сәйкес келетініне көз жеткізу керек.

Атаулы үлгілер

Міне, аталған үлгіні пайдалану мысалы:

# Функцияның бірінші аргументі аталған үлгінің аты болып табылады # Аталған үлгі әрқашан қос нүктеден басталады $STH->bindParam(":name", $name);

Сіз таңбашаларды пайдалана аласыз, бірақ олар байланысты массивтермен жұмыс істейді. Мысалы:

# Енгізілетін деректер $data = array("name" => "Michelle", "addr" => "Кузнечный Lane", "city" => "Cnjkbwf"); # Shorthand $STH = $DBH->("INSERT INTO folks (аты, мекенжайы, қаласы) мәні (:name, :addr, :city)"); $STH->орындау($деректер);

Кесте кілттері қос нүктені қажет етпейді, бірақ үлгі атауларына сәйкес болуы керек. Егер сіз массивтер массивін пайдалансаңыз, оны қайталап, жай ғана қоңырау шалуға болады орындауәрбір деректер жиыны үшін.

Атаулы үлгілердің тағы бір жақсы мүмкіндігі - сипаттар мен өріс атаулары сәйкес болған кезде нысандарды дерекқорға тікелей кірістіру мүмкіндігі. Мысалы:

# Қарапайым объект класының тұлғасы ( public $name; public $addr; public $city; function __construct($n,$a,$c) ( $this->name = $n; $this->addr = $a; $ this->city = $c; ) # etc... ) $cathy = new person("Катя","Ленин даңғылы","Можайск"); # Орындау: $STH = $DBH->("INSERT INTO folks (аты, мекенжайы, қаласы) мәні (:name, :addr, :city)"); $STH->execute((массив)$cathy);

Нысан түрін түрлендіру массивВ орындаусипаттардың массив кілттері ретінде қарастырылуын тудырады.

Деректерді қабылдау

Мәліметтерді алу үшін күй идентификаторы әдісі қолданылады ->алу(). Әдісті шақырмас бұрын алу()дерекқордан деректерді алу жолын PDO-ға айту керек. Келесі опцияларды таңдауға болады:

  • PDO::FETCH_ASSOC : баған атаулары бойынша индекстелген массивді қайтарады
  • PDO::FETCH_BOTH (әдепкі): баған атаулары мен сандары бойынша индекстелген массивді қайтарады
  • PDO::FETCH_BOUND: әдіс арқылы бағандарыңыздың мәндерін айнымалылар жиынына тағайындайды ->bindColumn()
  • PDO::FETCH_CLASS : аталған класстың қасиеттеріне баған мәндерін тағайындайды; сәйкес қасиет болмаса, ол жасалады.
  • PDO::FETCH_INTO : аталған класстың бар данасын жаңартады
  • PDO::FETCH_LAZY : комбинация PDO::FETCH_BOTH/PDO::FETCH_OBJ, пайдаланылуына қарай нысан айнымалы атауларын жасайды
  • PDO::FETCH_NUM : баған нөмірлері бойынша индекстелген массивді қайтарады
  • PDO::FETCH_OBJ : баған атауларына сәйкес сипат атаулары бар анонимді нысанды қайтарады

Шындығында, негізгі жағдайлар үш нұсқаны қолдану арқылы шешіледі: FETCH_ASSOC, FETCH_CLASSЖәне FETCH_OBJ. Деректерді шығару әдісін орнату үшін:

$STH->setFetchMode(PDO::FETCH_ASSOC);

Сондай-ақ, деректерді іздеу әдісін тікелей әдіс шақыруында орнатуға болады ->алу().

FETCH_ASSOC

Деректерді іздеудің бұл түрі баған атаулары бойынша индекстелген ассоциативті массив жасайды. Бұл кеңейтімдерді пайдаланатындарға жақсы белгілі болуы керек mysql/mysqli. Деректердің үлгісі:

$STH = $DBH->query("Атын, мекенжайды, қаланы таңдау"); # Деректерді іздеу режимін орнату $STH->setFetchMode(PDO::FETCH_ASSOC); while($row = $STH->fetch()) ( echo $row["name"]. "\n"; echo $row["addr"] . "\n"; echo $row["city"] ."\n";)

Цикл кезіндеаяқталғанша үлгі нәтижесі арқылы бір жолды қайталауды жалғастырады.

FETCH_OBJ

Деректерді іздеудің бұл түрімен сынып нысаны жасалады stdалынған деректердің әрбір жолы үшін:

$STH = $DBH->query("Атын, мекенжайды, қаланы таңдау"); # Деректерді алу режимін орнату $STH->setFetchMode(PDO::FETCH_OBJ); # нәтижені көрсету while($row = $STH->fetch()) ( echo $row->name. "\n"; echo $row->addr. "\n"; echo $row->city. " \ n";)

FETCH_CLASS

Шығарудың бұл түрімен деректер сіз таңдаған сыныпқа тікелей орналастырылады. Қолдану FETCH_CLASSнысанның сипаттары конструкторды шақырудан бұрын орнатылады. Бұл өте маңызды. Егер баған атауына сәйкес сипат жоқ болса, онда мұндай сипат жасалады (мысалы қоғамдық) Сіз үшін.

Бұл дерекқордан алынғаннан кейін деректерге түрлендіру қажет болса, оны жасалған бойда нысан автоматты түрде орындауы мүмкін дегенді білдіреді.

Мысалы, әрбір жазба үшін мекенжай ішінара жасырылуы керек жағдайды елестетіңіз. Біз конструктордағы сипатты манипуляциялау арқылы тапсырманы орындай аламыз:

Сыныптың құпия_адамы ( public $name; public $addr; public $city; public $other_data; function __construct($other = "") ( $this->address = preg_replace("//", "x", $this-> мекенжай); $this->other_data = $other; ) )

Деректер сыныпқа шығарылғаннан кейін мекенжайдағы барлық кіші әріптер a-z таңбалары x таңбасымен ауыстырылады. Енді сыныпты пайдаланып және деректерді шығарып, түрлендіру толығымен ашық түрде жүреді:

$STH = $DBH->query("Атын, мекенжайды, қаланы таңдау"); $STH->setFetchMode(PDO::FETCH_CLASS, "құпия_адам"); while($obj = $STH->fetch()) ( echo $obj->addr; )

Егер мекенжай «Ленинский даңғылы 5» болса, сіз «Lxxxxxxxxxx xx-x 5» дегенді көресіз. Әрине, деректер тағайындалғанға дейін конструкторды шақыру қажет жағдайлар бар. PDO мұны жүзеге асыру үшін құралдарға ие:

$STH->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, "құпия_адам");

Енді сіз алдыңғы мысалды режим жиынтығымен қайталағанда PDO::FETCH_PROPS_LATEконструктор шақырылған және сипаттар тағайындалғандықтан мекенжай жасырылмайды.

Қажет болса, нысанға деректерді шығару кезінде конструкторға аргументтерді беруге болады:

$STH->setFetchMode(PDO::FETCH_CLASS, "құпия_адам", массив("заттар"));

Әрбір нысан үшін конструкторға әртүрлі деректерді беру қажет болса, әдіс ішінде деректерді іздеу режимін орнатуға болады. әкелу:

$i = 0; while($rowObj = $STH->алу(PDO::FETCH_CLASS, "құпия_адам", массив($i))) ( // $i++ істерін орындау )

Кейбір басқа пайдалы әдістер

PDO қысқа мақалада толық сипатталмайтындықтан, біз негізгі операцияларды орындаудың бірнеше пайдалы әдістерін ұсынамыз.

$DBH->lastInsertId();

Әдіс ->lastInsertId()әрқашан дерекқор дескрипторы арқылы шақырылады (күй дескрипторы емес) және берілген қосылым үшін соңғы енгізілген жолдың автоматты ұлғайтылған идентификаторының мәнін қайтарады.

$DBH->exec("1 ЖЕРДЕ ЖОЮ"); $DBH->exec("SET уақыт_белдеуі = "-8:00"");

Әдіс ->exec()әртүрлі көмекші операциялар үшін қолданылады.

$саф = $DBH->цитата($қауіпті);

Әдіс ->цитата()квоталар жолдары, сондықтан оларды сұрауларда қолдануға болады. Бұл дайындалған өрнектер пайдаланылмаған жағдайда сіздің резервіңіз.

$rows_affected = $STH->rowCount();

Әдіс ->rowCount()мәнді қайтарады бүтін сан, операция арқылы өңделетін жолдар санын көрсетеді. PDO соңғы нұсқасында қате туралы есеп (http://bugs.php.net/40822) сәйкес бұл әдіс өрнектермен жұмыс істемейді. ТАҢДАУ. Егер сізде проблемалар болса және PHP жаңарту мүмкін болмаса, жолдар санын келесі жолмен алуға болады:

$sql = "Адамдардан COUNT(*) ТАҢДАУ"; if ($STH = $DBH->query($sql)) ( # Жолдар санын тексеріңіз if ($STH->fetchColumn() > 0) ( # Мұнда ТАҢДАУ коды болуы керек) басқа ( echo "Бар сұрауға сәйкес келетін жолдар жоқ.» ;) )

Сізге сабақ ұнады деп үміттенемін!

Келесі күні мен php PDO-мен айналысуды шештім. Жаңа технологияларды меңгеру қызықты және қажет. Мен орысша құжаттаманы еш жерден таба алмадым, сондықтан оны жариялауды жөн көрдім. Бұл мақала сізге қызықты болады деп үміттенемін.

Кіріспе

Алдымен PHP деректер объектілерінен (PDO) бастайық - PHP тіліндегі деректер қорына қол жеткізуге арналған жеңіл интерфейс. Ол MS SQL, Firebird, MySQL, Oracle, PostgreSQL, SQLite және т.б. сияқты көптеген дерекқорлармен жұмыс істей алады. Бірақ бұл жерде PDO дерекқорлармен жұмыс істеу үшін қажетті функционалдылықты қамтамасыз ететініне назар аудару керек, бірақ деректер қорының әрбір түрі үшін PHP кеңейтімі түрінде өзінің дерекқорға кіру драйвері орнатылуы керек.

PDO көмегімен сіз дерекқор түрінен толығымен тәуелсіз қолданбаларды жасай аласыз, сонымен бірге дайындалған мәлімдемелерді немесе транзакцияларды жасау сияқты дерекқорлардың көптеген функционалдығын пайдалана аласыз. Бұл функцияға дерекқор қолдау көрсетпеген жағдайда, PDO бұл функцияны өз құралдары арқылы эмуляциялайды, осылайша бағдарлама логикасын ешбір жолмен бұзбайды.

Қосылу өте қарапайым, тек енді бір жолда дерекқордың қандай түріне қосылып жатқаныңызды, хост атауын және дерекқордың атын дереу көрсету керек.

Пішім келесідей:

дерекқордың_түрі:хост=хост аты;db=атауы

Мысалды қарастырайық, бірақ PDO кітапханасынан (PDOException) ерекше жағдайларды пайдалану арқылы мысалды аздап күрделендірейік. Мәліметтер базасына сәтсіз қосылым болған жағдайда, біз бұл туралы нақты хабарлама аламыз, бірақ ешқайда келмеген кодтардың жиынтығы емес.

көріңіз ( $db = new PDO("mysql:host=localhost;dbname=test" , "root" , "" ); $rows = $db -> exec ("CREATE TABLE `testing`(id INT PRIMARY KEY AUTO_INCREMENT, fname VARCHAR(20) NULL DEFAULT "", электрондық пошта VARCHAR(50) NO NULL DEFAULT "")" ) ; ) catch(PDOException $e ) ( өледі(«Қате: « . $e -> getMessage () ); )

Егер сіз SQL өрнекте қате жіберсеңіз, PDO арнайы функциялары бар:

errorCode() – қате нөмірін қайтарады және

errorInfo() – қате нөмірін де, сипаттама мәтінін де қамтитын массивді қайтарады

Сұраныстарды тікелей екі функция арқылы жасауға болады:

exec() және query()

Олардың арасындағы айырмашылық қайтарылған нәтиженің түрінде, exec сұрау нәтижесінде әсер еткен жолдар санын қайтарады, ал екіншісі PDOStatement нысанындағы сұрау нәтижесін қайтарады, біз бұл туралы аздап сөйлесеміз. кейінірек.

Енді осы функцияларды кодқа қосып, мысалды біршама күрделірек етейік:

// конфигурацияның басында анықтау(«DB_DRIVER» , «mysql» ) ; анықтау(«DB_HOST» , «localhost» ); анықтау(«DB_NAME» , «сынақ» ) ; анықтау(«DB_USER» , «root» ); анықтау(«DB_PASS» , «» ); көріңіз ( // дерекқорға қосылу $connect_str = DB_DRIVER . ":host=" . DB_HOST. ";dbname=" . DB_NAME; $db = new PDO($connect_str , DB_USER, DB_PASS) ; // бірнеше жолдарды кірістіру алдыңғы мысалдағы кесте $rows = $db -> exec ("INSERT INTO `testing` VALUES (null, "Ivan"," [электрондық пошта қорғалған]"), (нөл, "Петр", " [электрондық пошта қорғалған]"), (нөл, "Василий", " [электрондық пошта қорғалған]") "); $error_array = $db -> errorInfo (); егер ($db ->
" ; // егер сұрау сәтті болса, // егер ($rows ) echo "Әсер еткен жолдар саны: " . $rows ."
" ; // енді дерекқордан бірнеше жолды таңдаңыз $result = $db -> сұрау ("SELECT * FROM `testing` LIMIT 2" ); // SQL өрнегінде қате болған жағдайда $ қате туралы хабарды көрсетіңіз error_array = $db -> errorInfo () ; if ($db -> errorCode () != 0000) echo "SQL қатесі: " . $error_array [ 2 ] . "

" ; // енді біз PDOStatement сыныбынан деректерді аламыз, бұл кезде ($row = $result -> fetch () ) ( // нәтижесінде біз print_r ассоциативті массивін аламыз.($жол); ) ) catch(PDOException $e ) ( өледі(«Қате: « . $e -> getMessage () ); )

Дайындалған өрнектер

Дайындалған өрнектер қарапайым SQL сұрауларына өте ұқсас, бірақ кейбір артықшылықтарға ие. Біріншіден, олардың орындау жылдамдығы жоғары, екіншіден, олар қауіпсіздік тұрғысынан сенімдірек, өйткені оларға берілген барлық параметрлер инъекциялардың барлық түрлерінен автоматты түрде қорғалған.

Әр жолы сұрауды жаңадан құрастырғанға қарағанда, бірнеше бірдей сұрауларды орындау кезінде олардың айтарлықтай жылдамдық артықшылығы бар. Қолданба мен дерекқор арасындағы трафик те сақталады.

PDO дайындалған өрнектермен жұмыс істеуге ыңғайлы функцияларды қамтамасыз етеді. Таңдалған дерекқор түрі дайындалған өрнектермен жұмыс істеуді қолдамаса, PDO олардың жұмысын өз әдістерімен жай ғана эмуляциялайды.

Сонымен, ең алдымен дайындалған өрнек құрайық, бұл Prepare() функциясы арқылы орындалады

Ол параметр ретінде SQL сұрауын алады, бірақ онда өзгертуді қажет ететін мәндердің орнына сұрақ белгісі (?) немесе псевдо атауы түрінде болуы мүмкін жалған айнымалылар орналастырылады. қос нүктеден басталатын айнымалы (:)

$sth1 = $db->дайындау("SELECT * FROM `test` WHERE id=:id");

$sth2 = $db->дайындау(“SELECT * FROM `testing` WHERE id=?”);

Айнымалы мәнді қалай анықтайтыныңызға байланысты сіздің болашақ жұмысыңыз байланысты болады.

Егер сіз айнымалы мәндерді сұрақ белгісімен анықтасаңыз, онда мәндер жиымын айнымалылар пайда болатын реттілікпен орындау функциясына беріңіз.

Егер айнымалы мәндерді атаулар бойынша тағайындасаңыз, функцияларды пайдаланып әрбір айнымалыға мән тағайындау керек:

bindValue() – жалған айнымалыға мән тағайындайды

bindParam() – жалған айнымалыны нақты айнымалымен байланыстырады және нақты айнымалы өзгерген кезде қосымша функцияларды шақырудың қажеті жоқ, бірден() орындауға болады.

Міне, бірінші опцияны пайдаланудың мысалы:


Назар аударыңыз, PDO нысаны PDOStatement класында дайындалған өрнекті жасағаннан кейін біз оны ғана қолданамыз, сәйкесінше, оның errorCode, errorInfo өз функциялары бар, сонымен қатар сұрауды орындау нәтижесі де бірден сақталады.

Ал енді екінші жол.

Псевдо айнымалыға мән тағайындау үшін bindValue() функциясын пайдаланыңыз

Бұл кодты жалған айнымалыны нақтымен байланыстыру арқылы оңайырақ жазуға болады:

Сонымен қатар, үшінші параметр ретінде айнымалының түрін көрсету (қажетсіз қателерді болдырмау үшін) өте қажет екенін қосу керек. Жеке мен айнымалы типі болмағандықтан, WHERE операторында қателерге тап болдым, өйткені ол айнымалыны сан емес, мәтін деп есептеді.

$sth3->bindParam(':id',$id, PDO::PARAM_INT);

$sth3->bindParam(':id',$id, PDO::PARAM_STR);

Осындай дайындалған өрнектерді пайдаланудың тағы бір жақсы артықшылығы - айнымалы мәндерден құтылу. Процедураға ауыстыру алдында барлық айнымалы мәндер өшіріледі және ешбір SQL инъекциясы қорқынышты емес.

Мәмілелер

Транзакция - барлығы орындалуы керек деректер қоры сұрауларының жинағы. Егер қандай да бір сұрау толтырылмаса немесе қатемен орындалса, транзакция тоқтатылады және дерекқорда деректер өзгермейді.

Бұл көптеген сұраулар бойынша деректер тұтастығын қамтамасыз ету үшін қажет. мысалы, шоттан шотқа ақша аудару кезінде.

PDO-да транзакцияны аяқтау үшін қолмен растау режиміне ауысу керек.

Айтпақшы, транзакциялар үнемі пайдаланылады, бірақ әдетте PDO автоматты растау режимінде жұмыс істейді, сондықтан барлық транзакциялар бір сұраудан тұрады.

Автоматты растау режимін өшіру үшін пәрменді орындаңыз:

$db->beginTransaction();

Осыдан кейін біз осы транзакцияда қажет болғанша дерекқорға сұраныстарды орындаймыз.

Барлық сұраулар аяқталғаннан кейін ғана транзакцияны функциямен растай аласыз

$db->commit();

немесе транзакциядан бас тарту

$db->қайтару();

Міне, транзакциялардың шағын мысалы:

көріңіз ( $connect_str = DB_DRIVER . ":host=" . DB_HOST . ";dbname=" . DB_NAME; $db = жаңа PDO($connect_str , DB_USER, DB_PASS) ; $rows = $db -> exec ("КЕСТЕ ҚҰРУ `` тестілеу`(id INT PRIMARY KEY AUTO_INCREMENT, fname VARCHAR(20) NO NULL DEFAULT "", электрондық пошта VARCHAR(50) NO NULL DEFAULT "", money INT NOT NULL DEFAULT 0) ENGINE=InnoDB;" ) ; $жолдар = $d -> exec ("INSERT INTO 'testing' VALUES (нөл, "Иван", " [электрондық пошта қорғалған]", 15000), (нөл, "Петр", " [электрондық пошта қорғалған]", 411000), (нөл, "Василий", " [электрондық пошта қорғалған]", 1500000) " ); // 50000 соманы Иваннан // Петрге аударып көрейік $summ = 50000 ; $транзакция = шын; $db -> beginTransaction (); $sth1 = $db -> сұрау ("Тестілеуден ақшаны ТАҢДАҢЫЗ WHERE fname="Иван"" ); $sth2 = $db -> сұрау ("Тестілеуден ақшаны ТАҢДАҢЫЗ WHERE fname="Petr"" ); $row1 = $sth1 -> алу (); $row2 = $sth2 -> алу (); егер (! $row1 || ! $row2 ) $транзакция = false ; $total2 = $summ + $row2 [ "ақша" ] ; $total1 = $row1 [ "ақша" ] - $summ ; егер (барлығы $1< 0 || $total2 < 0) $transaction = false ; $num_rows1 = $db ->exec ( . $total1 . "" ҚАЙДА fname="Иван"" ) ; $num_rows2 = $db -> exec ("ЖАҢАРТУ `тестілеу` ақшаны орнату="". $жалпы2 . "" ҚАЙДА fname="Петр"") ; if ($transaction ) ( echo "Транзакция сәтті аяқталды" ; $db -> commit () ; ) else ( "Транзакция орындалмады" жаңғырығы ; $db -> кері қайтару () ; ) ) catch(PDOException $e ) ( өледі(«Қате: « . $e -> getMessage () ); )

Сондай-ақ, барлық кесте түрлері транзакцияларды қолдамайтынын атап өткен жөн, сондықтан бұл мысалда стандартты MyISAM кестесінің орнына InnoDb кестесін пайдаландым.

Қорытындылай келе, бұл PDO бойынша толық нұсқаулықтан алыс екенін айтқым келеді. Сіз әрқашан барлық соңғы және толық ақпаратты мына жерден ала аласыз: http://www.php.net/manual/en/book.pdo.php

Зерттеу және жасау.

Bootstrap негізі: жылдам бейімделетін орналасу

Bootstrap шеңберіндегі адаптивті орналасу негіздері бойынша қадамдық бейне курс.

Күшті және практикалық құралды пайдаланып жай, жылдам және тиімді макет жасауды үйреніңіз.

Тапсырыс беру және төлеу үшін макет.

«WordPress сайтындағы сайт» тегін курсы

WordPress CMS-ті меңгергіңіз келе ме?

WordPress сайтында веб-сайттың дизайны мен орналасуы бойынша сабақтар алыңыз.

Тақырыптармен жұмыс істеуді және макеттерді қиюды үйреніңіз.

CMS WordPress-те веб-сайт дизайнын, макетін салу және орнату бойынша тегін бейне курс!

*Айналдыруды кідірту үшін тінтуірді басыңыз.

Артқа алға

PDO кеңейтімімен жұмыс істеу негіздері

Бүгін біз өте қызықты тақырыпты талқылаймыз - PHP үшін PDO кеңейтімімен жұмыс істеу негіздері.

PDO (PHP Data Objects) – жай ғана интерфейс, ол әртүрлі мәліметтер базасымен олардың ерекшеліктерін есепке алмай жұмыс істеуге мүмкіндік береді. PDO көмегімен біз әртүрлі дерекқорлар арасында оңай ауыса аламыз және басқара аламыз. Түсінікті болу үшін мысалды қарастырайық.

Бұрын MySQL дерекқорына қалай қосылуымыз керек еді?

Mysql_connect($хост, $пайдаланушы, $құпия сөз); mysql_select_db($db);

SQLite-ге қосылу үшін бізге келесідей жазу керек болды:

Sqlite_open($db);

Егер бізге PostgreSQL дерекқоры қажет болса, оны келесідей жазу керек:

Pg_connect("хост=$хост, dbname=$db, пайдаланушы=$пайдаланушы, құпия сөз=$құпия сөз");

Өте ыңғайлы емес, солай ма? Мәліметтер базасын өзгерткіміз келсе, көп кодты қайта жасауға тура келеді екен. Сонымен, мұны түзету үшін арнайы PHP кеңейтімі пайда болды - PDO.

Енді дерекқорға қалай қосылуға болатынын көрейік:

$db = new PDO("mysql:host=$host;dbname=$db", $user, $password);

$db = жаңа PDO("sqlite:$db);

PostgreSQL:

$db = new PDO("pgsql:host=$host;dbname=$db", $user, $password);

Көріп отырғаныңыздай, байланыс желісін қоспағанда, бәрі бірдей. Бұл жалғыз айырмашылық.


Енді сұрауларды қалай орындауға тура келетінін қарастырайық:

$sql = "INSERT INTO(аты, электрондық пошта) VALUES($name, $email)"; // MySQL mysql_query($sql); // SQLite sqlite_query($sql); // PostgreSQL pg_query($sql);

Енді біз осыдан қысқаша қорытынды жасай аламыз:

// PDO $нәтиже = $db->exec($sql);

Барлық! Біздің сұрау қандай дерекқорды пайдаланатынымызға қарамастан орындалады, және айнымалыға нәтижезардап шеккен жолдардың санын көрсетеді.

Дегенмен, біз бұл жолмен дерекқордан бірдеңені таңдай алмаймыз. Үлгі алу үшін біз not пайдалануымыз керек орындау, А сұрау.

$sql = "Пайдаланушылардан атау ТАҢДАУ"; $нәтиже = $db->сұрау($sql);

Енді қауіпсіздік туралы еске түсірейік, өйткені барлық деректерді тексеру қажет. Біз мұны бұрын қалай жасадық?

$sql = "Аты = $аты ҚАЙДАҒЫ пайдаланушылардан * ТАҢДАУ"; $name = $_POST["аты"]; // MySQL $атауы = mysql_real_escape_string($name); // SQLite $аты = sqlite_escape_string($name); // PostgreSQL $name = pg_escape_string($name);

Енді бізге мұны істеудің қажеті жоқ. PDO біз үшін бәрін жасайды.

$name = $db->тырнақша($name); $нәтиже = $db->сұрау($sql);

PDO өзі бәрін тексеріп, жіберілген деректерді өңдейді. Керемет пе? :) Алда одан да салқын! жалғастырайық.

Бұрын нәтижені массивке қалай түрлендірдік? Мысал ретінде MySQL деректер базасын қарастырайық.

$нәтиже = mysql_query($sql); // Сонымен $жол = mysql_fetch_assoc($нәтиже); // Немесе осылай... $жол = mysql_fetch_array($нәтиже, FETCH_ASSOC);

Ассоциативті сияқты, біз де нөмірленген массив ала аламыз. Енді мұның PDO-да қалай жасалатынын қарастырайық:

$stmt = $db->сұрау($sql); //Ассоциативті $нәтиже = $stmt->FETCH(PDO::FETCH_ASSOC); // Нөмірленген $нәтиже = $stmt->FETCH(PDO::FETCH_NUM); // Массивтердің екі түрі бір уақытта $нәтиже = $stmt->FETCH(PDO::FETCH_BOTH); // Объект $нәтиже = $stmt->FETCH(PDO::FETCH_OBJ);

Оны пайдалану өте оңай:

// Ассоциативті echo $нәтиже["аты"]; // Нөмірленген echo $нәтиже; // Объект жаңғырығы $нәтиже->аты;

«Жалқау» үшін мына нәрсе бар:

$stmt = $db->сұрау($sql); $нәтиже = $stmt->FETCH(PDO::FETCH_LAZY);

Ол барлық 3 түрді бірден қайтарады. Анау. Бұл FETCH_BOTHЖәне FETCH_OBJбірге. Сіз болжағандай, осыдан кейін деректерге үш жолдың кез келгенімен қол жеткізуге болады:

Echo $нәтиже->аты; echo $нәтиже["аты"]; echo $нәтиже;

Дегенмен Алутек бір жазбаны қайтарады, сондықтан біз барлық жазбаларды алғымыз келсе, онда пайдалануымыз керек Барлығын алу.

$stmt = $db->query("Пайдаланушылардан ТАҢДАУ *"); $нәтиже = $stmt->FetchAll(PDO::FETCH_ASSOC); foreach($нәтиже $user) ( echo $user["аты"]."
"; }

Бірақ оған қатысты тағы бір керемет нәрсе бар Алу. Оның көмегімен біз өз сыныбымызды мәліметтер қорындағы мәліметтермен толтыра аламыз автоматты түрде.

Сынып пайдаланушысы ( public $login; public $id; public function showInfo() ( echo "".$this->id.""." : ".$this->логин."
"; ) ) $db = new PDO("mysql:host=localhost;dbname=test", "root", ""); $stmt = $db->query("SELECT * FROM `users`"); $ нәтиже = $stmt->fetchAll(PDO::FETCH_CLASS, "Пайдаланушы"); foreach($пайдаланушы ретіндегі нәтиже) ( $user->showInfo(); )

Көріп отырғаныңыздай, бәрі өте қарапайым. Бізге тек тұрақты мәнді көрсету керек FETCH_CLASSжәне тырнақшаға үтір арқылы бөлінген, деректер кірістірілетін сыныптың атауы.

Содан кейін біз нысанды айналдырып, қажетті ақпаратты көрсетеміз.
Назар аударыңыз! Сыныптағы сипаттардың атаулары дерекқордағы өрістердің атауларына сәйкес келуі керек.

Басқа нәрселермен қатар, біз дайындалған сұраулар деп аталатындарды жасай аламыз. Олардың артықшылықтары қандай?

1. Сұранысты бір рет дайындап, содан кейін оны қажетінше бірнеше рет іске қоса аламыз. Және бірдей және басқа параметрлермен.

Сұраныс дайындалған кезде ДҚБЖ оны талдайды, құрастырады және оның орындалу жоспарын оңтайландырады. Күрделі сұраулар болған жағдайда, егер біз оны әртүрлі параметрлермен іске қоссақ, орындау уақыты байқалады. Дайындалған сұраулар болған жағдайда, бұл бір рет жасалады, демек, аз уақыт жоғалады.

2. Дайындалған сұраудың параметрлерін тырнақшалармен алып тастаудың қажеті жоқ, драйвер мұны автоматты түрде жасайды. Егер қолданба тек дайындалған сұрауларды пайдаланса, SQL инъекциялары іс жүзінде мүмкін емес.

Драйвер қолдамаса, PDO дайындалған сұрауларды эмуляциялай алады. Енді оларды қалай пайдалану керектігін қарастырайық?

$stmt = $db->prepare("INSERT INTO пайдаланушылар (аты, логин) VALUES (:name, :login)"); $stmt->bindParam(":name", $name); $stmt->bindParam(":логин", $логин); // Осы мәндері бар бір жолды енгізіңіз $name = "vasya"; $логин = "vasya123"; $stmt->execute(); // Енді әртүрлі мәндері бар тағы бір жол $name = "petya"; $login = "petya123"; $stmt->execute();

Әдіс bindParamпараметрлерін орнатуға мүмкіндік береді. Менің ойымша, бұл жерде бәрі түсінікті. Алдымен, деректер енгізілетін жерге келесі жолды жазыңыз « :Аты". Содан кейін біз олардың қайдан келетінін көрсетеміз. Бұл жағдайда олар айнымалылардан алынады атыЖәне кіру.

Енді біз бұл сұрауды әртүрлі параметрлермен қалағанымызша пайдалана аламыз және оны орындау үшін әдісті шақыру керек. орындау. Бұл параметрлер деп аталды. Аты аталмағандары да бар.

$stmt = $db->prepare("INSERT INTO пайдаланушылар (аты, логин) VALUES (?, ?)"); // Бірінші сұрақ белгісінің орнына атау айнымалысының деректері кірістіріледі $stmt->bindParam(1, $name); // Кіру айнымалысының деректері екінші сұрақ белгісінің орнына кірістіріледі $stmt->bindParam(2, $login); // Осы мәндері бар бір жолды енгізіңіз $name = "vasya"; $логин = "vasya123"; $stmt->execute(); // Енді әртүрлі мәндері бар тағы бір жол $name = "petya"; $login = "petya123"; $stmt->execute();

Келесі мәселе - қателерді қалай анықтаймыз?

Бұл үшін сынып бар PDOException. Мен барлық сұрауларыңызды блокта жазуды ұсынамын тырысыңыз.

Байқап көріңіз ( $db = new PDO("myql:host=localhost;dbname=test", "root", ""); $stmt = $db->query("SELECT * FROM users"); $result = $stmt ->fetch(PDO::FETCH_ASSOC); echo $result["login"]; ) catch(PDOException $e) (жаңғырық "Қате: ".$e->getMessage()."
"; echo "Желіде: ".$e->getLine(); )

Бұл жерде қателік жіберіп, mysql орнына myql деп жаздық. Және сынып PDOExceptionол туралы бізге жазады.

Оның бірнеше әдістері бар, бірақ ең жиі қолданылатындары getMessage()ол бізге қате мәтінін қайтарады және getLine(), ол қате орын алған жол нөмірін қайтарады.

Соңында, транзакциялар туралы сөйлесейік. Алдымен кодты беремін.

Байқап көріңіз ( $db = new PDO("mysql:host=localhost;dbname=test", "root", ""); $db->beginTransaction(); $stmt = $db->exec("INSERT INTO `users" `(`кіру`) VALUES("логин1")"); $stmt = $db->exec("INSERT INTO `users`(`login`) VALUES("login2")"); $stmt = $db- >exec("INSERT INTO `users`(`login`) VALUES("login3")"); $db->commit(); ) catch(PDOException $e) ( $db->rollBack(); )

Мұнда әдісті пайдаланып транзакцияны бастаймыз startTransaction(). Содан кейін кейбір сұрау коды келеді. Содан кейін біз әдісті шақырамыз міндеттеу()өзгертулерімізді растау үшін. Егер бірдеңе дұрыс болмаса, онда блокта ұстауәдіс деп атаймыз rollback(), ол біздің барлық деректерімізді алдыңғы күйге қайтарады.

«Бұл транзакциялар шынымен не үшін қажет?»- сен сұрадың. Бұл сұраққа жауап беру үшін жоғарыда келтірілген мысалды қарастырыңыз. Онда сіз «логин» өрісіне мәнді енгізесіз кіру1, кіру2, кіру3.

Енгізгеннен кейін елестетіп көрейік кіру1Және кіру2, кейбір қате орын алды. Бұл деректер енгізілгені белгілі болды, және кіру3- Жоқ. Көптеген жағдайларда бұл қабылданбайды және болашақта қолданбаны бұзады.

Дәл осындай жағдайлардың алдын алу үшін транзакциялар қажет. Егер біздің сценарий сәтсіз болса, онда әдіс rollback()барлығын бастапқы түріне қайтарады. Анау. кіру1Және кіру2да енгізілмейді. Осы қатені еліктеп көрейік.

Байқап көріңіз ( $db = new PDO("mysql:host=localhost;dbname=test", "root", ""); $db->beginTransaction(); $stmt = $db->exec("INSERT INTO `users" `(`кіру`) VALUES("логин1")"); $stmt = $db->exec("INSERT INTO `users`(`login`) VALUES("login2")"); exit("қате") ; $stmt = $db->exec("INSERT INTO `users`(`login`) VALUES("login3")"); $db->commit(); ) catch(PDOException $e) ( $db-> rollback(); )

Енгізгеннен кейін кіру1Және кіру2функцияны пайдаланып сценарийден шығамыз Шығу(). Біз ерекшелік тастаймыз, біз блокқа түсеміз ұстау, содан кейін біз бәрін бастапқы түріне қайтарамыз. Енді базаға қарасақ, ол жерден көрмейміз кіру1Және кіру2.

Осы кезде аяқтаймыз. Әлбетте, бұл жерде біз PDO бізге беретін барлық нәрселерді қарастырған жоқпыз, бірақ біз онымен жұмыс істеу негіздерін үйрендік. Бұл кеңейтім туралы толығырақ ақпаратты PHP ресми веб-сайтынан әрқашан таба аласыз.

Материалды Владислав Андреев сайт үшін арнайы дайындаған

P.S. PHP және OOP тілдерін меңгеруде әрі қарай жылжытқыңыз келе ме? Веб-сайтты құрудың әртүрлі аспектілері бойынша премиум сабақтарға, соның ішінде PHP тілінде бағдарламалауға, сондай-ақ OOP көмегімен нөлден бастап PHP-де жеке CMS жүйесін құру бойынша тегін курсқа назар аударыңыз:

Сізге материал ұнады ма және маған алғыс айтқыңыз келді ме?
Тек достарыңызбен және әріптестеріңізбен бөлісіңіз!


PDO (PHP Data Objects) – әртүрлі деректер қорларына қол жеткізу үшін қарапайым интерфейсті қамтамасыз ететін PHP кеңейтімі. Қарапайым және қысқаша айтқанда, PHP тіліндегі PDO көмегімен сіз әртүрлі типтегі дерекқорларға қосыласыз.

Бұл оқулықта біз MySQL дерекқорына қосылатын боламыз, себебі бұл ең көп таралған дерекқор.

Дерекқорға қосылу

Мәліметтер қоры серверінің аты бар екенін және оған пайдаланушылар да қосыла алатынын білу керек, яғни қосылу үшін логин мен парольді пайдалану керек.

Дерекқорға қосылудың мысалы:

$db = new PDO("mysql:host=$host;dbname=$db", $user, $pass);

Менің ойымша, егер сізді PDO қызықтырса, онда сіздің біліміңіз жеткілікті және бұл синтаксисті сізге түсіндірудің қажеті жоқ.

Сонымен, бізде дерекқорға қол жеткізу үшін қосылу нысаны бар.

Ерекше жағдайды өңдеу

PDO пайдаланған кезде, try(...)catch(...) құрылымын пайдаланып қосылым қателерін анықтауды ұсынамын. Міне, осындай кодтың мысалы:

Байқап көріңіз ( $db = new PDO("myql:host=$host;dbname=$dbname", $user, $pass); ) catch(PDOException $e) ( echo "Сізде қате бар: ".$e-> getMessage()».
"; echo "Желіде: ".$e->getLine(); )

Қатені өңдеуге қатысты әр түрлі пікірлер бар, мысалы, бәрі әрқашан try(...)catch(...) құрылымын пайдалануды ұсынбайды. Мәселе мынада, PHP бәрібір экранда қате туралы хабарды басып шығарады, сондықтан бұл код артық. Мысалы, транзакцияны кері қайтарғыңыз келсе де, бұл құрылыс сізге пайдалы болады, бірақ төменде толығырақ.

PDO, сұрау әдісі арқылы мәліметтер қорынан мәліметтерді алу

Мәліметтер қорынан таңдау үшін біз сұрау әдісін қолданамыз, оған SQL сұрау жолын береміз.

$db->query("Пайдаланушылардан ТАҢДАУ *");

Бұл синтаксис дерекқорлардың барлық түрлері үшін жұмыс істейтінін ұмытпаңыз.

Сондай-ақ, SQL сұрауларында жіберілетін деректердің қауіпсіздігі туралы ұмытпаңыз. PDO-да mysql_real_escape_string() функциясының аналогы бар - цитата әдісі.

$login = $db->цитата($_POST["логин"]); $sql = "Пайдаланушылардан ТАҢДАУ * ЖЕРДЕ кіру = $логин"; $нәтиже = $db->сұрау($sql);

Нәтижені өңдеу, FETCH және FETCHALL әдістері.

Енді $res айнымалысынан алынған нәтижені массивке түрлендіру керек. Бұл тұрақты мән берілетін FETCH әдісі арқылы орындалады.

$res = $db->сұрау($sql); $нәтиже = $res->FETCH(PDO::FETCH_NUM); // нөмірленген $нәтиже = $res->FETCH(PDO::FETCH_ASSOC); // ассоциативті $нәтиже = $res->FETCH(PDO::FETCH_BOTH); // ассоциативті және бірге нөмірленген $нәтиже = $res->FETCH(PDO::FETCH_OBJ); // нысан түрі $нәтиже = $res->FETCH(PDO::FETCH_LAZY); // барлық түрлері бірден

Әлбетте, FETCH_LAZY тұрақтысы сценарийді баяулатады, сондықтан оны пайдаланбаған жөн.

FETCH әдісі нәтижеден бір жазбаны қайтарады. Барлық жазбаларды шығарып алғыңыз келсе, FETCHALL әдісін пайдалануыңыз керек. Кейіннен FETCHALL пайдалану нәтижесінде алынған нәтиже мысалда көрсетілгендей foreach циклінде өңделеді:

$query = $db->query("Пайдаланушылардан ТАҢДАУ *"); $нәтиже = $query->FETCHALL(PDO::FETCH_ASSOC); foreach($нәтиже $arry ретінде) ( echo $arry["аты"] ."
"; }

FETCH_CLASS тұрақтысы

FETCH_CLASS тұрақтысы арнайы түсініктемені қажет етеді, ол алдын ала жасалған классты дерекқор сұрауының нәтижесінен алынған деректермен толтыруға мүмкіндік береді.

FETCH_CLASS тұрақтысын қолданатын мысалды қарастырайық:

Сынып пайдаланушысы (жалпыға $login; public $pass; public функциясы showInfo() ( echo "
". $this->өту."
" . " : " . $this->логин ."
"; ) ) $нәтиже = $stmt->FETCHALL(PDO::FETCH_CLASS, "Пайдаланушы"); foreach($нәтиже $user) ( $user->showInfo(); )

Маңызды ережені ұмытпаңыз - құрылған сыныптағы сипаттардың атаулары дерекқордағы өрістердің атауларымен бірдей болуы керек.

Дайындалған өрнектер

SQL сұрауыңызда айнымалы мәндер болса, дайындалған өрнектер қолданылуы керек.

PDO дайындалған мәлімдемелер PHP деректер нысандарын пайдаланудың негізгі себебі болып табылады, өйткені олар пайдаланушы жасаған айнымалы мәндерді қамтитын SQL сұрауларын орындаудың жалғыз қауіпсіз жолы болып табылады.

PDO-да дайындалған өрнектер айнымалы арнайы маркермен – толтырғышпен ауыстырылатын кәдімгі SQL сұранысы болып табылады.

Атаулы толтырғыштар

Алдымен, аталған толтырғышты қарастырайық, оның синтаксисі, мысалы: :email.

Толтырғыштарды қолданатын INSERT сұрауының мысалын қарастырайық.

$stmt = $db->prepare("INSERT INTO хабарламаларға (электрондық пошта, хабарлама) VALUES (:email, :message)");

Бұл мысалда сұраудағы айнымалы мәндердің орнына біз екі толтырғышты қолдандық (:email, :message)").

$stmt = $db->prepare("INSERT INTO хабарламаларға (электрондық пошта, хабарлама) VALUES (:email, :message)"); $stmt->bindParam(":электрондық пошта", $электрондық пошта); $stmt->bindParam(":хабарлама", хабарлама); $email = «№1 электрондық пошта»; $message = "Кейбір хабарлама мәтіні"; $stmt->execute(); $email = «Электрондық пошта №2»; $message = "Кейбір хабарлама мәтіні"; $stmt->execute();

Есіңізде болсын, SQL сұрауын дайындау үшін оны дайындау() әдісінде жазамыз. Содан кейін, қандай толтырғышты қандай айнымалыны байланыстыру керектігін көрсету үшін bindParam() әдісін қолданамыз. SQL сұранысын орындау үшін execute() әдісін шақырамыз.

Сонымен, тағы бір рет дайындалған өрнектермен кезең-кезеңімен жұмыс істеу реттілігі:

  • Tayyor() әдісін орындау нәтижесін $stmt айнымалысына тағайындаймыз.
  • bindParam() әдісін қолданып, біз айнымалылар мен толтырғыштарды байланыстырамыз.
  • Айнымалыларға мәндерді тағайындау.
  • execute() әдісін қолданып, мәліметтер базасына сұранысты орындаймыз.
  • Бұл синтаксисті жазуға болады

    $stmt = дайындау("Электрондық пошта = :электрондық поштаны қолданушылардан атын ТАҢДАУ"); $stmt->execute(массив("электрондық пошта" => $электрондық пошта));

    Жиым execute() әдісіне берілуі керек екенін көруге болады, онда пернелер толтырғыштардың атына сәйкес келуі керек.

    Айтпақшы, bindParam() әдісінде bindValue() синонимі бар.

    Аты жоқ толтырғыштар

    Енді атаусыз толтырғыштармен жұмыс істеуді қарастырайық.

    $stmt = дайындау("Пайдаланушылардан атын ТАҢДАУ ЖЕРДЕ электрондық пошта =?") $stmt->орындау(массив($электрондық пошта));

    Бұл синтаксисте толтырғыш:атауды жазудың орнына оны жазудың басқа формасы – сұрақ белгісі:? .

    Мұнда $email массивінің мәндері толтырғыштарға бір-бірден тағайындалады:? , бірақ біздің мысалда бір ғана толтырғыш бар.

    Мұнда bindParam() әдісін қолданатын атаусыз толтырғыштарды пайдаланудың тағы бір мысалы келтірілген:

    $stmt = $db->prepare("Мақалаларды INSERT INTO (тақырып, мәтін) VALUES (?, ?)"); $stmt->bindParam(1, $электрондық пошта); $stmt->bindParam(2, $хабарлама); $email = "Электрондық пошта №1"; $message = "Кейбір хабарлама мәтіні"; $stmt->execute(); $email = «№2 электрондық пошта»; $message = "Кейбір хабарлама мәтіні"; $stmt->execute();

    Дерекқорға енгізу, exec() әдісі

    Егер дерекқорға бірдеңе жазғымыз келсе, онда PDO::exec() әдісін де қолдануға болады.

    $sql = "INSERT INTO (логин, құпия сөз) VALUES ($login, $password)"; $нәтиже = $db->exec($sql);

    Егер бұл сұрау орындалса, $result айнымалысы кестеде әсер ететін жолдар санын қамтиды.

    PDO::exec() INSERT сұрауларын орындайды, бірақ дерекқордан деректерді ала алмайды; бұл PDO::query() әдісімен өңделеді. PDO::exec() тек SQL сұрауын іске қосады және оны орындау кезінде тартылған жолдар санын қайтарады, ол SELECT операторының нәтижесін қайтармайды.

    PDO мәліметтер базасымен жұмыс істейді. Дерекқордың қандай да бір түрімен жұмыс істей алмасаңыз, php.ini сайтына өтіп, extension=php_pdo_ (деректер базасының атауы) деп басталатын жолдарды іздеңіз және оларға түсініктеме алыңыз.

    Жаңадан бастаушыларға арналған Php: кері шақыру функциялары, 34-сабақ! https://www.youtube.com/watch?v=2NwLHXUoXcw https://www.youtube.com/watch?v=GMzI6jR_bE4 https://www.youtube.com/watch?v=gFJsBQIqpto PHP 9-сабақ Рекурсия https://www.youtube.com/watch?v=GMzI6jR_bE4 ://www.youtube.com/watch?v=gLAeJcKkd6c http://php.net/manual/ru/mysqli-result.fetch-array.php /* іріктеу нәтижелерін тазалау */ mysqli_free_result($result); /* қосылымды жабу */ mysqli_close($link); http://myrusakov.ru/sql-osnovy.html Жақсы мақала: https://ru.wikipedia.org/wiki/Join_(SQL) OOP PHP. Кеңейтім құралдары Мэтт Зандстраның "PHP. Объектілер, шаблондар және бағдарламалау әдістері" кітабының "Кеңейтім құралдары" тарауы. https://www.youtube.com/watch?v=6L2bxtTBCro

    http://phpfaq.ru/pdo#intro - мұнда жақсы мақала бар. Ерекшеліктер туралы маңызды ақпарат бар.

    Ол қарапайымырақ сипатталған: http://myrusakov.ru/php-data-objects.html

    Бейне: https://www.youtube.com/watch?v=ACUiBH5qV0U&list=PLr_acfJGVcirEijJXmKxj8QGkWkKb-Tj-&nohtml5=False

    Кіріспе

    Қосымша түрде --with-mysql-sock[=DIR] барлық MySQL кеңейтімдері, соның ішінде PDO_MYSQL үшін MySQL unix ұяшығының көрсеткішіне орын орнатады. Көрсетілмеген болса, әдепкі орындар ізделеді.

    Қосымша түрде --with-zlib-dir[=DIR] libz орнату префиксіне жолды орнату үшін пайдаланылады.

    $ ./конфигурациялау --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock

    Өзгеріс журналы Нұсқа сипаттамасы
    5.4.0 mysqlnd PDO_MYSQL құрастыру кезінде әдепкі MySQL кітапханасы болды. Бұрын libmysqlclient әдепкі MySQL кітапханасы болды.
    5.4.0 MySQL клиенттік кітапханаларына 4.1 және одан төменірек қолдау көрсетілмейді.
    5.3.9 Mysqlnd және OpenSSL көмегімен SSL қолдауы қосылды.
    5.3.7 libmysqlclient және OpenSSL көмегімен қосылған SSL қолдауы.
    Алдын ала анықталған тұрақтылар

    Төмендегі тұрақты мәндерді осы драйвер анықтайды және кеңейтім PHP-ге құрастырылғанда немесе орындау уақытында динамикалық түрде жүктелгенде ғана қолжетімді болады. Бұған қоса, осы драйверге арналған тұрақты мәндер осы драйверді пайдалансаңыз ғана пайдаланылуы керек. Драйверге тән атрибуттарды басқа драйвермен пайдалану күтпеген әрекетке әкелуі мүмкін. PDO::getAttribute() коды бірнеше драйверлерге қарсы жұмыс істей алатын болса, драйверді тексеру үшін PDO::ATTR_DRIVER_NAME төлсипатын алу үшін пайдаланылуы мүмкін.

    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (бүтін ) Егер бұл төлсипат PDOStatement ішінде TRUE мәніне орнатылса, MySQL драйвері MySQL API интерфейсінің буферленген нұсқаларын пайдаланады. Егер сіз портативті кодты жазып жатсаңыз, оның орнына PDOStatement::fetchAll() пайдалануыңыз керек.

    №1 мысал Сұрауларды MySQL ішінде буферлеуге мәжбүрлеу

    PDO::MYSQL_ATTR_LOCAL_INFILE (бүтін)

    Қосу ЖЕРГІЛІКТІ INFILE ЖҮКТЕЛУ.

    PDO::MYSQL_ATTR_INIT_COMMAND (бүтін)

    MySQL серверіне қосылу кезінде орындалатын пәрмен. Қайта қосылған кезде автоматты түрде қайта орындалады.

    Ескерту, бұл тұрақтыны жаңа дерекқор дескрипторын құру кезінде драйвер_опциялар массивінде ғана пайдалануға болады.

    PDO::MYSQL_ATTR_READ_DEFAULT_FILE (бүтін)

    Опцияларды my.cnf орнына аталған опция файлынан оқыңыз. Бұл опция mysqlnd пайдаланылса қолжетімді емес, себебі mysqlnd MySQL конфигурация файлдарын оқымайды.

    PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (бүтін)

    my.cnf немесе MYSQL_READ_DEFAULT_FILE арқылы көрсетілген файлдан аталған топтағы опцияларды оқыңыз. Бұл опция mysqlnd пайдаланылса қолжетімді емес, себебі mysqlnd MySQL конфигурация файлдарын оқымайды.

    PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (бүтін)

    Максималды буфер өлшемі. Әдепкі бойынша 1 МБ. Бұл тұрақтыға mysqlnd қарсы құрастырылған кезде қолдау көрсетілмейді.

    PDO::MYSQL_ATTR_DIRECT_QUERY (бүтін)

    Тікелей сұрауларды орындаңыз, дайындалған мәлімдемелерді пайдаланбаңыз.

    PDO::MYSQL_ATTR_FOUND_ROWS (бүтін)

    Өзгертілген жолдардың санын емес, табылған (сәйкес) жолдардың санын қайтарыңыз.

    PDO::MYSQL_ATTR_IGNORE_SPACE (бүтін)

    Функция атауларынан кейін бос орындарға рұқсат беріңіз. Барлық функцияларды сақталған сөздерді атайды.

    PDO::MYSQL_ATTR_COMPRESS (бүтін)

    Желі байланысының қысылуын қосыңыз. Бұған PHP 5.3.11 нұсқасы бойынша mysqlnd-ге қарсы құрастырылған кезде де қолдау көрсетіледі.

    PDO::MYSQL_ATTR_SSL_CA (бүтін)

    SSL сертификат органына файл жолы.

    Бұл PHP 5.3.7 нұсқасы бойынша бар.

    PDO::MYSQL_ATTR_SSL_CAPATH (бүтін)

    PEM пішімінде сақталған сенімді SSL CA сертификаттары бар каталогқа файл жолы.

    Бұл PHP 5.3.7 нұсқасы бойынша бар.

    PDO::MYSQL_ATTR_SSL_CERT (бүтін)

    SSL сертификатына файл жолы.

    Бұл PHP 5.3.7 нұсқасы бойынша бар.

    PDO::MYSQL_ATTR_SSL_CIPHER (бүтін)

    OpenSSL түсінетін пішімдегі SSL шифрлау үшін пайдаланылатын бір немесе бірнеше рұқсат етілген шифрлар тізімі. Мысалы: DHE-RSA-AES256-SHA:AES128-SHA

    Бұл PHP 5.3.7 нұсқасы бойынша бар.

    PDO::MYSQL_ATTR_SSL_KEY (бүтін)

    SSL кілтіне файл жолы.

    Бұл PHP 5.3.7 нұсқасы бойынша бар.

    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT (бүтін)

    Сервердің SSL сертификатын тексеруді өшіру жолын қамтамасыз етеді.

    Бұл PHP 7.0.18 және PHP 7.1.4 нұсқаларында бар.

    PDO::MYSQL_ATTR_MULTI_STATEMENTS (бүтін)

    FALSE мәніне орнатылған кезде PDO::prepare() және PDO::query() екеуінде де көп сұрауды орындауды өшіреді.

    Ескерту, бұл тұрақтыны жаңа дерекқор дескрипторын құру кезінде драйвер_опциялар массивінде ғана пайдалануға болады.

    Бұл PHP 5.5.21 және PHP 5.6.5 нұсқаларында бар.

    Орындалу уақытының конфигурациясы

    Бұл функциялардың әрекетіне php.ini ішіндегі параметрлер әсер етеді.

    PDO_MYSQL конфигурация параметрлері Атауы әдепкі өзгермелі
    pdo_mysql.default_socket "/tmp/mysql.sock" PHP_INI_SYSTEM
    pdo_mysql.debug NULL PHP_INI_SYSTEM
    PHP_INI_* режимдерінің қосымша мәліметтері мен анықтамаларын қараңыз.

    Мұнда конфигурация директивалары туралы қысқаша түсініктеме берілген.

    Unix домен ұяшығын орнатады. Конфигурацияда домен ұясы табылса, бұл мәнді компиляция уақытында орнатуға болады. Бұл ini параметрі тек Unix болып табылады.

    Pdo_mysql.debug логикалық

    PDO_MYSQL үшін жөндеуді қосады. Бұл параметр PDO_MYSQL mysqlnd қарсы құрастырылғанда және PDO жөндеу режимінде ғана қол жетімді.

    Мазмұны
    • PDO_MYSQL DSN - MySQL дерекқорларына қосылу

    Оларды орнатқаннан гөрі

    айн/мин -Uvh remi-release-26.айн/мин
    rpm -Uvh epel-release-6-8.noarch.rpm

    Php-pdo және php-mysql алу үшін реми репозиторийін пайдалануға болатынын біліңіз.

    yum --enablerepo=remi орнату php-pdo
    yum --enablerepo=remi орнату php-mysql

    Apache бағдарламасын қайта іске қосыңыз

    systemctl тоқтату httpd
    systemctl бастау httpd

    Барғаныңыз жақсы!

    10 жыл бұрын

    SQLSTATE: Жалпы қате: 2014 Басқа буферленбеген сұраулар белсенді болған кезде сұрауларды орындау мүмкін емес. ...

    Бұл корольдік аурумен күресу мүмкін. Ешқашан бір әрекетте орындалатын мәлімдемелерді стек жасамаңыз. Мен бұл қатені көрген барлық жазбаларда ешкім бұл мүмкіндікті ешқашан айтпайды.

    Бұл мысал Zend Framework мысалы, бірақ теориясы бірдей.


    Бұл жақсы жұмыс істейді, бірақ егер сіз оны басқа сұраумен орындасаңыз, PDO «буферленбеген» қатені жібермейді.


    Оны жеке сұрауларға кесу мәселені шешеді.