Home > PHP/MySql > PHP/MySQL 7: mysqli prepared statement бичих

PHP/MySQL 7: mysqli prepared statement бичих

Өмнө нь mysqli болон prepared-statement -ийн талаар бичсэн одоо шуудхан жишээ бичээд түүн дээрээ тайлбар хийгдээд явъя. Хоёр янзаар бичиж болно. Жишээнүүдийг өмнөх бичлэгүүдэд ашиглаж байсан доорхи хүснэгт дээр хийе.

--
-- Database: `dbtest`
-- Table structure for table `albums`
--
 
CREATE TABLE IF NOT EXISTS `albums` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `artist` VARCHAR(50) NOT NULL,
  `title` VARCHAR(50) NOT NULL,
  `year` INT(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
 
--
-- Dumping data for table `albums`
--
 
INSERT INTO `albums` (`id`, `artist`, `title`, `year`) VALUES
(1, 'Rolling Stones', 'England''s Newest Hit Makers', 1964);

1. Bound Parameters

Энэ хэлбэрийг дээрхи хүснэгтэнд бичлэгүүд оруулж байгаа жишээгээр авч үзье. Жишээнд дэлгэрэнгүй тайлбар хийлээ.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
< ?php 
/* MySQL server-т холбогдож байна. */ 
	$mysqli= new mysqli('localhost', 'root', '', 'dbtest') or die("Can't connect to MySQL Server.");     
 
/* 	Хамгийн чухал зүйл эндээс эхлэж байна. 
	$mysqli->prepare гэж query-гээ бэлтгэж байна. Бэлтгэж байгаа 
	гол санаа нь шинээр оруулах	утга байх газар ? тэмдэг тавьсан 
	байна. Энэ prepares statment-ийг ажилуулах үед 	түүнийх нь 
	оронд байх ёстой утга нь очиж тавигдан ажиллана. Иймд үүнийг 
	query темплате 	гэж хэлж болохоор байна. Ингээд бэлтгэсэн 
	statment-ээ серверт илгээнэ.
 */ 
if ($stmt = $mysqli->prepare("insert into albums(artist, title, year) values(?,?,?)")) {
	/* 	? -ийн оронд бичигдэх утгуудыг авах хувьсагчдыг бэлтгэж байна.
		bind_param-ийн эхний параметр болох "ssi" нь түүний дараагийн 
		3 параметрийн өгөгдлийн төрлүүдийг	тодорхойлж өгч байна. 
		s- string, i-interger байна. Учир нь манай жишээний 
		artist, title 2 нь тэмдэгт	мөр буюу стринг харин year нь 
		interger буюу бүхэл тоон талбар учир түүнд харгалзах утгуудыг 
		дамжуулахаар бэлтгэж байгаа байдал нь энэ юм.
	*/
	$stmt->bind_param("ssi", $artist, $title, $year); 
 
	/*
		Дээрхи мөрөнд бэлтгэсэн утга дамжуулах хувьсагчдадаа одоо яг 
		оруулах утгуудаа өгч байна. Гараас утга авч байгаа бол энд 
		формнаас ирж байгааутгуудаа $_POST[] гэх мэтээр авна. 
	*/
	$artist = 'Queen'; 
	$title='Greatest Hits';
	$year=1994;
 
	/*
		Дээрхи мөрүүдэд statment-ээ бэлдсэн, утга авах хувьсагчдыг 
		бэлтгэсэн,  утгуудыг нь олгосон одоо харин тэд нарыг бүгдийг 
		нийлүүлээд ажилуулж байна. Бичлэг  нэмэгдсэн эсэхийг 
		$stmt->affected_rows аар авч болох нь.
	*/
	$stmt->execute(); 
	printf("%d Бичлэг нэмэгдлээ.<br />", $stmt->affected_rows);
 
	/*
		Дахин шинэ бичлэг оруулах бол дээр бэлдсэн статментээ ашиглаад 
		зөвхөн утгуудыг өгөхөд л болж байна. Энэ нь олон бичлэг нэмэх үед 
		сайхан боломжийг бий болгож байгаагаас гадна хурдыг нэмэгдүүлж байна
	*/
	$artist = 'Beatles'; 
	$title="A Hard Day's Night";
	$year=1964;
 
	$stmt->execute(); 
	printf("%d Бичлэг нэмэгдлээ.<br />", $stmt->affected_rows);
    // 	Статментее ашиглаад дууссан бол хаалаа.
	$stmt->close(); 
 
}
/* 	Серверт үүсгэсэн холболтоо хаалаа.*/ 
	$mysqli->close(); 
?>

2. Bound Results

Хүснэгтийн мэдээллийг гаргаж харуулах үед хэрэглэгдэнэ. Бид өмнөх жишээнүүдэд давталт хийж $row гэж массиваар эсвэл list() функцээр гарч ирсэн үр дүнг авч хэвлэж байсан бол одоо энэ зорилгодоо prepared statement ашиглая.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
< ?php 
/* MySQL server-т холбогдож байна. */ 
	$mysqli= new mysqli('localhost', 'root', '', 'dbtest') or die("Can't connect to MySQL Server.");     
/* Статментее бэлтгэж байна. */ 
if ($stmt = $mysqli->prepare('SELECT artist, title, year FROM albums ORDER BY id')) { 
	/* Ажиллуулж байна. */
	$stmt->execute(); 
    /*  $stmt->bind_result гэж SELECT -ийн ард байгаа талбаруудад харгалзах хувьсагчидыг авч байна. 
		Эдгээрээр дамжуулан хүснэгтийн утгуудыг авах юм.  
	*/ 
    $stmt->bind_result($artist, $title, $year); 
 
    /* 	$stmt->fetch() -ийн тусламжтайгаар давталт хийн
	query-ний үр дүнд гарч ирсэн хүснэгтийн утгыг авч байна. 
	Энэ үйлдэл бидний сайн мэдэх while($row=mysql_fetch_array()) байна гэдэгийг 
	та бүхэн хараад мэдэж байгаа биз дээ.
	*/ 
    while($stmt->fetch() ){ 
		/* Дэлгэцэнд хэвлэж байна.*/
        printf("%s - %s  - %d<br />", $artist, $title, $year); 
    } 
    $stmt->close(); 
} 
$mysqli->close(); 
?>

Дээрхи 2 хэлбэрийг хослуулан л ашиглах шаардлагатай шүү дээ. Тэгвэл доорхи жишээг одоо тайлбаргүй хараад ойлгоно бизээ.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
< ?php 
$mysqli= new mysqli('localhost', 'root', '', 'dbtest') or die("Can't connect to MySQL Server.");     
if ($stmt = $mysqli->prepare('SELECT artist, title, year FROM albums WHERE artist=? ORDER BY id')) { 
 
	$stmt->bind_param("s", $artist_name); 
	$artist_name = 'Beatles'; 
 
	$stmt->execute(); 
 
	$stmt->bind_result($artist, $title, $year); 
    while($stmt->fetch() ){ 
        printf("%s - %s - %d <br />", $artist, $title, $year); 
    } 
    $stmt->close(); 
} 
$mysqli->close(); 
?>

Параметруудын төрлийг доорхи хүснэгтийн дагуу тогтоож өгнө.

i All INT types
d DOUBLE and FLOAT
b BLOBs
s All other types

No related posts.

Related posts brought to you by Yet Another Related Posts Plugin.

Categories: PHP/MySql Tags: , ,
  1. Melug
    August 4th, 2009 at 11:49 | #1

    Энгийн PHP функц дуудагдах үедээ параметруудаа хувилдаггүй юмуу? Өөрөөр хэлбэл тухайн функцийг дуудахдаа дуудаж байгаа хувьсагчаа тухайн функцийн стэйкд зориулаад хувилах тухай л ярьж байна. Хэрвээ хувилдаг бол bind_param хийснийхээ дараа artist_name-д утга олгож байх юм?

  2. ddsan
    August 4th, 2009 at 14:24 | #2

    Nadad php ashiglan neg jooxon interface xiix xereg garaad, tegeed php deer database persistence layer xaigaad oloxgui bsiin, enugger bichchuul amarch um uu gej bodloo. Soyoloo bagshid sanal bolgox library bgaa u?

  3. August 4th, 2009 at 14:32 | #3

    mysql-тэй жижиг ажил бол ингээд бичихэд амар биз. Харин нилээд том цаашид хөгжүүлэх ажил бол ямар нэг фрамворк ашиглсан дээр гэж бодож байна. Жишээ нь symfony, zendframework ч юм уу.

  4. ulzii
    August 8th, 2009 at 02:17 | #4

    php deer database-d persistence hiih gej baigaa bol propel gej bii teriig haraarai,

  5. ddsan
    August 13th, 2009 at 13:58 | #5

    Tiim bn, Propel , Doctrine – PHP Object Relational Mapper geed goyo um bdag um bn , gehdee, bi ashiglaagui ee, select, execute xiideg 2 function bicheed avsan.
    function select($query, $types,$params) {
    $results = array();
    $mysqli= new mysqli(”, ”, ”, ”) or die(“”);
    $mysqli->query(“SET NAMES ‘utf8′”);
    $stmt = $mysqli-> prepare($query);
    if($stmt) {
    if(sizeof($params) > 0) {
    array_unshift($params, $types);
    call_user_func_array(array($stmt, “bind_param”), $params);
    }
    $stmt->execute();
    $stmt->store_result();
    $result = $stmt->result_metadata();
    $fields = array();
    foreach($result->fetch_fields() AS $field) {
    $fields[] = &$row[$field->name];
    }
    call_user_func_array(array($stmt, “bind_result”), $fields);
    while($stmt->fetch()) {
    $temp = array();
    foreach($row AS $key => $val) {
    $temp[$key] = $val;
    }
    array_push($results, $temp);
    }
    $stmt->free_result();
    $stmt->close();
    }
    $mysqli -> close();
    return $results;
    }

    function execute($query, $types, $params) {
    $mysqli= new mysqli(‘localhost’, ‘root’, ”, ‘db_erel’) or die(“”);
    $mysqli->query(“SET NAMES ‘utf8′”);
    $stmt = $mysqli-> prepare($query);
    if($stmt) {
    if(sizeof($params) > 0) {
    array_unshift($params, $types);
    call_user_func_array(array($stmt, “bind_param”), $params);
    }
    $stmt->execute();
    $stmt->close();
    }
    $mysqli -> close();
    }

    Ingej ashiglasaniixaa daraaa l php ORM lib olson . daraa um xiivel l php ORM -r xiiye

  6. ulzii
    August 14th, 2009 at 03:48 | #6

    hm, yahav ehlen surch baigaa hund bol bolj l baina. gehdee ih unprofessional bolj bna. Chi uuriinhuu DB-Class uusgeed bugdiig object handaltat hiivel zugeer dee, Jisheee n chamd DB-iin busad function -uud hereg bolohoor yahiin, ahiaad DB-Connect uusgeed yavaad baih uu esvel end tend SQL-command bicheed l yavuu gedeg bolno shd. Medeej jijig project-iin huvid bol Propel ene ter ahadna. Tiim bolohoor chi uuriin gesen sain zohion baiguulsan DB-Klass uusge. DB-Connect deeree Singleton gej argachlal baidgiig harna biz.

    Chinii ene deerh bichsen bol yahav arai hooson baisnaas deer l yum. Ternees bish ch…

  7. August 19th, 2009 at 12:58 | #7

    Za saihan boljee bur ankhnaas ni ehleed duustal 3 honog baahan jishee ene ter hiij owoo php g anzaarch ehelj bn buh jishee ene ter bolloo gehdee ene jishee l bolsongui ur dun ni hewlegdej haragdahgui iin code oo tawichihwal yun deer aldsanaa harchih ym san php dawgui ym aa odoo neg gaigui framework deer l urgeljleed ywchihwal ch php surah geed bdag aspx deer joohon ym hiij bsan hund bol ih oilgomjtoi ym bn aa zarim neg setgegdeluudiig unshihaar hedii php ankh shat ch gesen heterhii hyulbar ym asuuh ym aa baaz ydaj html geh met ymnuuddaa ehleeed oilgochihood tanii hicheeliig uzwel ch uneheer oilgomjtoi ym bn bayrlalaa daraagiin hicheeliig chin huleej baiy hundetgesen: 3 honog tanii saitaas salaagui ankhlan suragch bn

  8. August 19th, 2009 at 13:03 | #8

    Neeree ene jisheeg form ashiglaad hiisen ym aa ymar ch bsan $_post[Name]; geed awdagaaraa awchihsan uu utgaa tegeed ur ni yu ch garahgui aldaa ch garahgui tiim l ym bolchihloo ug kodoo belen tawichihwal hna aldsanaa harchih ym soyolerdene bagshaa :mrgreen:

  9. August 20th, 2009 at 11:33 | #9

    Дээр байгаа жишээнүүдийг Localhost дээр ажиллаж байснаар нь доорхи хаягаар татаж авна уу. http://www.soyolerdene.com/examples/mysqli/mysqli_jishee.rar

    Энхээд. $_POST[‘name’] гэсэн юм байгаа биз дээ. жижигээр бол болохгүй шүү.

  10. October 9th, 2009 at 00:38 | #10

    urgeljlel-g ni hezee tavih ve mysqli ORM tei ni ❗

  11. question
    November 12th, 2009 at 16:05 | #11

    hi admin yaj jisheegee oruulsan yum be? Editor deer bgaa yum shig

  12. ganzaah
    December 16th, 2009 at 21:16 | #12

    adminaa ogdoliin baazd zyrga oruulah upload hiih delete hiih zasvarlah geed ed nariin jishee b.val olood ogooch ???gui

  13. ch
    December 23rd, 2009 at 23:10 | #13

    Puuh hicheelee ymr udaan oruuldiin. hagas jiliin umnuhteiguu l baij bhiin. php giin zunduu l mongol jishee baigaashd. php surmaar bgaa humuus endees http://www.4shared.com/file/179626345/c37198ea/php.html
    mongol/angli hicheel tataj avaarai. ihenh ni mongoloor baigaa. oir zuuriin yum hiihed hangalttai hicheel baigaa. Odoo php geer ch hol yvahgui yum shig sanagdaad bgaan. zunduu shine shine hamgaalalt saitai texnologiud garaad baina. PHP songohdoo sain bodoj baigaal songooroi. Minii bodloor demii yum shigee. Tehdee surah neg surval zugeershu!

  14. sh
    February 6th, 2010 at 04:05 | #14

    prepared statement iig persistent connection toi ashiglahgui bol hereggui ed gej bodoj bna. php iin framework uudiig n surcan n deer bizde. zend , symfony geed.

  15. February 7th, 2010 at 23:58 | #15

    ch: Удаан оруулахуу хурдан оруулах уу гэдэг бол миний л асуудал. Би чиний болон бусад хүмүүсийн өмнө хурдан оруулах үүрэг хүлээгээгүй юм ш тээ. PHP-ээр хол явахгүй шалтгаанаа тайлбарлана уу. Би чиний тавьсан хичээлийг татаж байгаа 2 дахь л хүн боллоо :-)

    sh: яадаг ч байсан prepared statement нц давуу талтай л даа. Мэдээж фрамеворк ашигласан дээр. Би веб апп хийх ажлуудадаа симфони ашиглах санаатай байна.

    юутай санал сэтгэгдэлээ үлдээсэнд тнкс

  16. February 8th, 2010 at 00:02 | #16

    ch gej nertei hunii http://www.4shared.com/file/179626345/c37198ea/php.html hayagaar tavisan medeelel mash huuchirsan (2005 ony yeiinh bololtoi) medeelel baigaag anhaarna uu.

  17. ch
    February 17th, 2010 at 14:43 | #17

    Minii tavisan file joohn huuchin baij magadgui ee. Anhlan surch baigaa humuust nemer boloh bol uu gj tavisiin. php giin sintaks ni odoohondoo uurchlugdchuugui baigaa tul huuchin geed baih heregguil bolvuu harin ch uuruu bie daan surch baigaa hund Mongol hel deer baival iluu deer baij magad. Zuvhun ene blogt bichsen comment deeree php file aa shareleed URL iig ni tavisan bolhoor gants hoyor tatsan tataagui ni nadad hamaagui ee hehe. iishee orj irsen humuus uursduu medne bizde tatah tatahguigee. Ta nart tus boloh gj sharelsan yum. Ene admin ni uul ni bagsh l suragtai baisiin bi buruu sonsoogui bol. Zugeer yum bichij baihad dairaal baihiimaa. Taniig medeegee joohn hurdan oruulaachee l gsiin. Shuumjleld durgui yumaadaa. Za ter php geer hol yvahgui gesen shaltgaanaa tailbarlaach gsn baina. Ene zugeer l minii bodol. Nadad l tegej sanagdaad baina. jsp, asp ed nar ni hamaagui der. PHP giin Sul tal ni gevel: nuh tsoorhoi ihtei (jishee ni ter ajaxmaa gdg nuhur gantshan injection eer php deer hiisen ihenh site iig hackdsan). Sain tal ni gevel: hussen yumaa ymr neg yumand barigdahgui hiideg ni goy. asp deer bol control doo joohn barigdaad baidiin. Za bas neg yum nemj helehed ajil deer garahad PHP g l shaardaad baidag suragtai baisan. Za tegeed uursduu songono bizde.

  18. February 17th, 2010 at 19:02 | #18

    CH:Chini tavisan file huuchinii huvd bol joohonoor barahgyi huuchin yum baina lee l dee. Dairsan barih gevel arai uur yum baidag baih. Bi hicheel zaadag. php eer web programchlal ehlen surch baigaa humuust hicheel orohod iluu tohiromjtoi yum shig sanagddag yum. Bichsen yuman dotor maani shuumjleh yum baival bi durtaiya huleen avna. Harin yum oruulahgyi baina gedeg deer bol neg ih shuumjluulmeergyi baigaa yum. Yagaad gevel ene minii huvuun blog uchir.

  19. February 22nd, 2010 at 01:14 | #19

    neg yum asuuh gesiin

    yamar negen site deer burtguuleed hugtsaa ni duusdii shdee
    tehleer yaj ter hugtsaag tootsoj barij chadj bgan ene tal deer
    tuslaach yaaj teriig shalgadiin bol ???? :roll:

  20. ssssss
    May 13th, 2010 at 11:50 | #20

    bi php iin talar sain medehguildee gehdee ene hicheeluud ih taalaglaa. bi bol http://www.php.net iig ashigladag bagshaa ta sudalj bgaad orchuulaad hicheelee nemj boln shuu dee…..

  21. August 10th, 2010 at 16:24 | #21

    http://net.tutsplus.com/tutorials/php/the-problem-with-phps-prepared-statements/

    prepare(‘SELECT body FROM posts’) or die(‘Problem preparing query’);
    $stmt->execute();

    $meta = $stmt->result_metadata();

    while ( $field = $meta->fetch_field() ) {

    $parameters[] = &$row[$field->name];
    }

    call_user_func_array(array($stmt, ‘bind_result’), $parameters);

    while ( $stmt->fetch() ) {
    $x = array();
    foreach( $row as $key => $val ) {
    $x[$key] = $val;
    }
    $results[] = $x;
    }

    return $results;

    }

    $results = read();
    ?>

    untitled

  22. Azsaikhan
    October 9th, 2014 at 11:29 | #22

    php mysql css ed namriig tiim sain oilgodogui zowlgoo ch ymuu power pont hicheel bnu bi surmaar bna

  1. No trackbacks yet.