Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsługa możliwości MySQL 5.x w PHP 5.x
Forum PHP.pl > Forum > PHP > Object-oriented programming
anas
Hej.

Jak w temacie. Poszukuje jakiejś dobrej klasy(najlepiej abstrakcji) do obsługi MySQL w wersji 5.x z jego nowymi możliwościami. Ciekawe wydaje mi się PDO, ale z tego co się doczytałem obsługuje MySQL w wersjach 4.0.x i niższych.

Czy mysqli obsługuje nowe możliwości MySQL ? - powodem utworzenia tego rozszerzenia, jak twierdzą serwisy zend.com, czy php.net było właśnie umożliwienie korzystania z dobrodziejstw nowych wersji MySQL (ale wyczytałem tylko o MySQL 4.1.x - czy np. 5.0.x również?).

Chodzi mi głównie o obsługę transakcji, procedur i funkcji.

Z góry thx za pomoc.

Pozdrawiam.

anas
dr_bonzo
PDO obsluzy mysql 5.0 -- przed chwila sprawdzalem, tzn tylko polaczenie, SELECT.

do po laczenia sie -- manual nie wspomina (moze za krotko szukalem) o specyfikowani portu serwera wu mysqla, droga prob i bledow oraz analogi dotarlkem do rozwiazania:
  1. <?php
  2.     $dbh = new PDO('mysql:host=127.0.0.1;port=3307;dbname=baza', 'user', 'haslo' );
  3.  
  4. ?>

------
"Chodzi mi głównie o obsługę transakcji, procedur i funkcji." -- tego nie sprawdzilem sad.gif
SongoQ
Cytat
Chodzi mi głównie o obsługę transakcji, procedur i funkcji.


Procedury i funkcje nie zaleza od db layera bo mozesz je wolac tak samo jak SQL, ale zawsze mozna sobie stworzyc ich wlasna obsluge, pytanie tylko po co?

Odnosnie transakcji podobnie jak w funkcjach wysylane jest polecenie do bazy danych i PDO wystawia metody: beginTransaction(), commit(), rollBack().
anas
Hej.

W takim razie ide testowac. SongoQ - chodzi mi wlasnie o fakt czy beginTransaction(), commit(), rollBack() zadziala poprawnie dla polaczenia z 5.x wersja serwera MySQL. Co do wywolywania procedur czy funkcji rzeczywiscie mozna to potraktowac jak zwykle zapytania, wiec tutaj nie problem smile.gif.

dr_bonzo: thx odnosnie polaczenia i info o probach.

pozdrowka

anas
krzysztof f.
Wczoraj zainstalowałem php 5.1.0 i mysql 5.0.15 i zacząłem testować PDO w takiej konfiguracji. Zamieszczam zestaw testów, który u mnie zakończył się powodzeniem. Sprawdziłem podstawowe rzeczy. Niestety napotkałem problemy w wywoływaniu procedur poprzez PreparedStatment i dowiązywanie parametrów metodami PDOStatement::bindParam() i PDOStatement::bindValue(). Póki co nie udało mi się. Efekt jest taki że skrypt się zapętla. Może komuś się udało?

Do testowania kodu używam http://sourceforge.net/projects/simpletest/

  1. <?php 
  2.  
  3. require_once 'simpletest/unit_tester.php';
  4. require_once 'simpletest/reporter.php';
  5.  
  6. class PDOPureTestCase extends UnitTestCase
  7. {
  8.  private $_oDb;
  9.  private $_oInsertStmt;
  10.  private $_oSelectStmt;
  11.  
  12.  public function __construct()
  13.  {
  14. parent::__construct( 'Test rozszerzenia PDO' );
  15.  
  16. // Połączenie z bazą
  17. $aParams = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  18. PDO::ATTR_CASE => PDO::CASE_LOWER,
  19. PDO::ATTR_PERSISTENT => 1, 
  20. PDO::ATTR_TIMEOUT => 5 );
  21. $this->_oDb = new PDO( 'mysql:host=localhost;dbname=test', 'root', 'blazej', $aParams );
  22. $this->_oDb->setAttribute( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1 );
  23.  
  24. $this->_oInsertStmt = $this->_oDb->prepare( 'INSERT INTO test ( id,
  25. name )
  26.  VALUES ( ?, ? )' );
  27. $this->_oSelectStmt = $this->_oDb->prepare( 'SELECT id,
  28. name
  29.  FROM test
  30.  WHERE name = ?' );
  31. $this->_oDeleteStmt = $this->_oDb->prepare( 'DELETE FROM test
  32.  WHERE id = ?' );
  33.  }
  34.  
  35.  function setUp() {
  36. $this->_oDb->exec( "INSERT INTO test ( id,
  37.  name )
  38. VALUES ( 1,
  39.  'Krzysztof' ) " );
  40.  }
  41.  
  42.  function tearDown() {
  43. $this->_oDb->exec( 'DELETE FROM test' );
  44.  }
  45.  
  46.  public function testTransactionCommit()
  47.  {
  48. try
  49. {
  50.  $bCaughtException = false;
  51.  $this->_oDb->beginTransaction();
  52.  $this->_oDeleteStmt->bindValue( 1, 1, PDO::PARAM_INT );
  53.  $iDeletedRows = $this->_oDeleteStmt->execute();
  54.  $this->_oDb->commit();
  55.  
  56.  $this->assertEqual( 1 , $iDeletedRows );
  57.  $this->assertEqual( 0 , $this->_oDb->query( 'SELECT COUNT(*) FROM test' )->fetchColumn() );
  58. }
  59. catch ( Exception $oE )
  60. {
  61.  $bCaughtException = true;
  62. }
  63. $this->assertFalse( $bCaughtException );
  64.  }
  65.  
  66.  public function testTransactionRollBack()
  67.  {
  68. try
  69. {
  70.  $bCaughtException = false;
  71.  $this->_oDb->beginTransaction();
  72.  $this->_oDeleteStmt->bindValue( 1, 1, PDO::PARAM_INT );
  73.  $iDeletedRows = $this->_oDeleteStmt->execute();
  74.  $this->_oDb->rollBack();
  75.  
  76.  $this->assertEqual( 1 , $iDeletedRows );
  77.  $this->_oSelectStmt->bindValue( 1, 'Krzysztof', PDO::PARAM_STR );
  78.  $this->_oSelectStmt->execute(); 
  79.  $this->assertEqual( 'Krzysztof' , $this->_oSelectStmt->fetchColumn( 1 ) );  
  80. }
  81. catch ( Exception $oE )
  82. {
  83.  $bCaughtException = true;
  84. }
  85. $this->assertFalse( $bCaughtException );
  86.  }
  87.  
  88.  public function testOnceQuery()
  89.  {
  90. try
  91. {
  92.  $bCaughtException = false;
  93.  $aResult = array( 0 => 1,
  94.  1 => 'Krzysztof' );
  95.  $oStmt = $this->_oDb->query( 'SELECT * FROM test' );
  96.  $this->assertIsA( $oStmt, 'PDOStatement' );
  97.  $this->assertEqual( $oStmt->fetch( PDO::FETCH_NUM ), $aResult );
  98. }
  99. catch ( Exception $oE )
  100. {
  101.  $bCaughtException = true;
  102. }
  103. $this->assertFalse( $bCaughtException );
  104.  }
  105.  
  106.  public function testStoredProcedure()
  107.  {
  108. try
  109. {
  110.  $bCaughtException = false;
  111.  $this->_oDb->exec( 'CALL select_name( @param )' );
  112.  $oStmt = $this->_oDb->query( 'SELECT @param' );
  113.  $this->assertEqual( 'Krzysztof', $oStmt->fetchColumn() );
  114. }
  115. catch ( Exception $oE )
  116. {
  117.  $bCaughtException = true;
  118. }
  119. $this->assertFalse( $bCaughtException );
  120.  }
  121.  
  122.  public function testStoredFunction()
  123.  {
  124. try
  125. {
  126.  $oStmt = $this->_oDb->query( "SELECT hello('Krzysztof')" );
  127.  $this->assertEqual( 'Hello, Krzysztof!', $oStmt->fetchColumn() );
  128. }
  129. catch ( Exception $oE )
  130. {
  131.  $bCaughtException = true;
  132. }
  133. $this->assertFalse( $bCaughtException );
  134.  }
  135.  
  136. }
  137. ?>


..jest green bar, więc nie jest tak źle. Ja kupuje to.
SongoQ
Odnosnie metody PDOStatement::bindParam() to tak naprawde stworzone bylo z mysla o ORACLE gdyz wymagany jest bind param jesli zapytanie przekracza 4KB. Jesli faktycznie w przypadku MySQL jest blad to nic innego nie zostaje nam jak czekac az zostanie to naprawione.
Ozzy
Cytat
Niestety napotkałem problemy w wywoływaniu procedur poprzez PreparedStatment i dowiązywanie parametrów metodami PDOStatement::bindParam() i PDOStatement::bindValue(). Póki co nie udało mi się. Efekt jest taki że skrypt się zapętla


Wydaje mi się, że mamy podobny problem. Mój jest opisany tutaj i został oznaczony jako fałszywy, ponieważ wg. developerów php jest to wina binarnej niekompatybilności klienta MySQL, chociaż uzywając klienta 5.0.16 i serwera 5.0.16 praktycznie każde użycie mysqli powoduje zapętlenie się.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.