bnghtz

perl-mysql-dbi-alappeldak_magyarazattal.pl

Jan 19th, 2014
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6.47 KB | None | 0 0
  1. #! /usr/bin/perl
  2. ###### IMPORTS ################################################################
  3.  
  4. use strict;
  5. use warnings;
  6.  
  7. use DBI;    # ez kell a db kezeleshez
  8.  
  9. ###### CONFIG #################################################################
  10.  
  11. my $DATABASE = 'myDb';
  12. my $USERNAME = 'user';
  13. my $PASSWORD = 'secret';
  14.  
  15. my $kulcs1 = 7;
  16. my @kulcs2 = (1,2,3,4);
  17.  
  18. ###### SUBS ###################################################################
  19.  
  20. # ---- PrepareOnDemand / Ismetelt lekerdezes / Egy soros lekerdezes -----------
  21.  
  22. my $sth_lid;     # global, amiben taroljuk a prepare-elt lekerdezest majd
  23. sub last_insert_id()
  24. {
  25.     # csak akkor prepare-eli, ha meg nem volt egyszer prepare.
  26.     # Ez optimalizalas a tobbszor futtatott, de azonos SQL utasitasok eseten.
  27.     $sth_lid = $main::dbh->prepare('SELECT LAST_INSERT_ID()') or
  28.     die "Prepare (Example/lid) failed.\n"
  29.     unless defined($sth_lid);
  30.     # futtatja a prepare-elt lekerdezest.
  31.     $sth_lid->execute() or
  32.     die "Execute (Example/lid) failed.\n";
  33.  
  34.     # ezekbe a valtozokba gyujti ki az infokat
  35.     my ($id,$temp);
  36.     # sql lekerdezes sorain vegigmegy
  37.     while (my @row = $sth_lid->fetchrow_array())
  38.     {
  39.     # ha tobb soros a lekerdezes die-ol (mivel itt csak
  40.     die "Multiple rows (Example/lid).\n" if $temp;
  41.     # eltarolja a lekeres eredmenyenek 0. elemet
  42.     $id = $row[0];
  43.     # itt allitja be, hogy volt mar lekerdezes
  44.     $temp = 1;
  45.     }
  46.     # Ez fontos!!! MYSQL hibakat kezeli.
  47.     die "Database error (Example/lid).\n" if $sth_lid->err();
  48.     # Ez akkor ervenyes, ha a lekerdezesben nem volt egyetlen sor sem.
  49.     die "LAST_INSERT_ID returned empty set (Example/lid).\n"
  50.     unless $temp;
  51.  
  52.     return $id;
  53. }
  54.  
  55. ###### CODE ###################################################################
  56.  
  57. # csatlakozik a db-hez
  58. $main::dbh = DBI->connect("DBI:mysql:$DATABASE", $USERNAME, $PASSWORD) or
  59.     die "Cannot connect to database.\n";
  60.  
  61. # ---- Lekerdezes -- tobb sor -------------------------------------------------
  62. # ahol prepare-ben ? van, az lesz az execute argumentumaban, ez lehet dinamikus is
  63. my $temp = join(', ',map { '?' } @kulcs2);
  64. my $sth = $main::dbh->prepare(
  65.     'SELECT a, b, c FROM dbitest ' .
  66.     "WHERE kulcs1 = ? AND kulcs2 IN($temp)") or
  67.     die "Prepare (Example/1) failed.\n";
  68. $sth->execute($kulcs1,@kulcs2) or
  69.     die "Execute (Example/1) failed.\n";
  70.  
  71. while (my @row = $sth->fetchrow_array())
  72. {
  73.     # Itt kellene valamit kezdeni az adatokkal...
  74.     # my ($a,$b,$c) = @row;
  75.     print '(' . join(', ',@row) . ")\n";
  76. }
  77. die "Database error (Example/1).\n" if $sth->err();
  78.  
  79. # ---- Lekerdezes -- egy sor --------------------------------------------------
  80.  
  81. $sth = $main::dbh->prepare(
  82.     'SELECT a, b, c FROM dbitest WHERE a = ?') or
  83.     die "Prepare (Example/2) failed.\n";
  84. $sth->execute(2) or
  85.     die "Execute (Example/2) failed.\n";
  86.  
  87. $temp = 0;
  88. my ($a,$b,$c);
  89. while (my @row = $sth->fetchrow_array())
  90. {
  91.     die "Multiple rows (Example/2).\n" if $temp;
  92.     ($a,$b,$c) = @row;
  93.     $temp = 1;
  94. }
  95. die "Database error (Example/2).\n" if $sth->err();
  96. die "Empty set (Example/2).\n" unless $temp;
  97.  
  98. print "a: $a, b: $b, c: $c\n";
  99.  
  100. # ---- Lekerdezes -- ismetelt -------------------------------------------------
  101.  
  102. $sth = $main::dbh->prepare(
  103.     'SELECT a, b, c FROM dbitest WHERE kulcs1 = ?') or
  104.     die "Prepare (Example/3) failed.\n";
  105.  
  106. foreach my $i (1 .. 5)
  107. {
  108.     $sth->execute($i) or
  109.     die "Execute (Example/3) failed.\n";
  110.  
  111.     while (my @row = $sth->fetchrow_array())
  112.     {
  113.     # Itt kellene valamit kezdeni az adatokkal...
  114.     # my ($a,$b,$c) = @row;
  115.     print "$i: (" . join(', ',@row) . ")\n";
  116.     }
  117.     die "Database error (Example/3).\n" if $sth->err();
  118. }
  119.  
  120. # ---- Lekerdezes -- megszakitott ---------------------------------------------
  121.  
  122. $sth = $main::dbh->prepare(
  123.     'SELECT a, b, c FROM dbitest ORDER BY a') or
  124.     die "Prepare (Example/4) failed.\n";
  125. $sth->execute() or
  126.     die "Execute (Example/4) failed.\n";
  127.  
  128. while (my @row = $sth->fetchrow_array())
  129. {
  130.     # Itt kellene valamit kezdeni az adatokkal...
  131.     # my ($a,$b,$c) = @row;
  132.     print '(' . join(', ',@row) . ")\n";
  133.     last if ($row[1] =~ /bla/i);
  134. }
  135. die "Database error (Example/4).\n" if $sth->err();
  136. $sth->finish();
  137.  
  138. # ---- Beszuras -- sima -------------------------------------------------------
  139.  
  140. $sth = $main::dbh->prepare(
  141.     'INSERT INTO dbitest (b, c, kulcs1, kulcs2) VALUES (?, ?, ?, ?)') or
  142.     die "Prepare (Example/5) failed.\n";
  143. $sth->execute('Retek',23,1,2) or
  144.     die "Execute (Example/5a) failed.\n";
  145. $sth->execute('Karalabe',-1,5,3) or
  146.     die "Execute (Example/5b) failed.\n";
  147.  
  148. # ---- Beszuras -- id visszaolvasassal ----------------------------------------
  149.  
  150. $sth = $main::dbh->prepare(
  151.     'INSERT INTO dbitest (b, c, kulcs1, kulcs2) VALUES (?, ?, ?, ?)') or
  152.     die "Prepare (Example/6) failed.\n";
  153. $sth->execute('Repa',77,7,1) or
  154.     die "Execute (Example/6) failed.\n";
  155.  
  156. # my $id = $main::dbh->last_insert_id(undef,undef,undef,undef) or
  157. #     die "last_insert_id returned false.\n";
  158. my $id = last_insert_id();
  159. print "new id: $id\n";
  160.  
  161. # ---- Modosotis --------------------------------------------------------------
  162.  
  163. $sth = $main::dbh->prepare(
  164.     'UPDATE dbitest SET b = ?, c = ? WHERE a = ?') or
  165.     die "Prepare (Example/7) failed.\n";
  166. $temp = $sth->execute('Karfiol',42,$id) or
  167.     die "Execute (Example/7) failed.\n";
  168. print "$temp sor moosova.\n";
  169.  
  170. # ---- Torles -----------------------------------------------------------------
  171.  
  172. $sth = $main::dbh->prepare(
  173.     'DELETE FROM dbitest WHERE a = ?') or
  174.     die "Prepare (Example/8) failed.\n";
  175. $sth->execute($id) or
  176.     die "Execute (Example/8) failed.\n";
  177.  
  178. # ---- Zarolas ----------------------------------------------------------------
  179. # egymas utan tobb reszbol allo, de egy muveletkent felfoghato SQL utasitasok
  180. # eseten zaroljuk a tablakat, h mas ne tudjon ugyan abban a pillanatban olyan
  181. # valtozasokat eszkozolni, ami megvaltoztathatja a lekert adatokat.
  182. # (olvasas eseten irasra, iras eseten ovlvasasra, irasra)
  183.  
  184. $temp = $main::dbh->do('LOCK TABLES dbitest READ');
  185. die "Database error (Example/L).\n" unless defined($temp);
  186.  
  187. # ---- Feloldas ---------------------------------------------------------------
  188.  
  189. $temp = $main::dbh->do('UNLOCK TABLES');
  190. die "Database error (Example/U).\n" unless defined($temp);
  191.  
  192. # -----------------------------------------------------------------------------
  193.  
  194. # Ezt ne felejtsuk el, hogy diszkózni kell!
  195. $main::dbh->disconnect() or die "Disconnect failed.\n";
  196.  
  197. exit 0;
Advertisement
Add Comment
Please, Sign In to add comment