Jump to content
php.lv forumi

PDO vai tomēr MYSQLI


Valcha

Recommended Posts

Jautājums pieredzējušajiem. Beidzot esmu nolēmis atteikties no manuālā mysql_real_escape_string un pāriet uz PREPARED STATEMENTS. Neredzu nepieciešamību tuvajos gados pāriet uz citu DB.

 

Salasījos 3 gadus vecos rakstos, ka PDO ir lēnāks par MYSQLI. Kāda ir jūsu pieredze mūsdienās? Lasu rakstus, apskatus, katrā ir pilnīgi cita versija par ātrdarbību. PDO galvenā būtība jau ir viegla pāreja uz citām DB, bet tas man nav aktuāli...

 

Varbūt vēl kādi ierosinājumi sakarā ar šo izvēli / pāreju?

 

Cik jau paspēju saskarties, MYSQLI problēma ir tas, ka PREPARED STATEMENTS selecta gadījumā nesaņem asociatīvu masīvu, tātad jāņem talkā pašrakstīta funkcija. Atkal - ātrdarbības samazināšana.

Edited by Valcha
Link to comment
Share on other sites

Cik jau paspēju saskarties, MYSQLI problēma ir tas, ka PREPARED STATEMENTS selecta gadījumā nesaņem asociatīvu masīvu, tātad jāņem talkā pašrakstīta funkcija. Atkal - ātrdarbības samazināšana.

 

Asociatīvu masīvu gan var dabūt.. PDO neesmu lietojis, bet MySQLi gan iesaku ļoti ērti strādāt.

Edited by Trac3 !!
Link to comment
Share on other sites

Asociatīvu masīvu gan var dabūt.. PDO neesmu lietojis, bet MySQLi gan iesaku ļoti ērti strādāt.

 

Varbūt vari parādīt, kā ar MySQLi iegūsti asociatīvu masīvu? :) Tad es varbūt pagaidām nosliektos uz MySQLi.

Link to comment
Share on other sites

 

Nu it kā nav gan - kā tu izmanto prepare metodi, tā tālāk ir jāizmanto MySQLi_STMT execute:

$stmt = $mysqli->prepare("SELECT * FROM test WHERE id = ?"); 
$stmt->bind_param("i", $i); 
$stmt->execute(); 

 

Un pēc execute jau darbojas MySQLi_STMT metodes, kas, neatbalsta fetch_assoc.

Link to comment
Share on other sites

Es izmanotju extendotu mysqli klasi, kurai ir dažas funkcijas, kas automātiski escape-o datus un protams Singletona patterns instances iegūšanai, rezultātā kverijus rakstu šādi:

 

db::i()->q('SELECT * FROM users WHERE username=%s AND password=%s',$username,$password);

 

kverijs tiek apstrādāt ar sprintf, kuram par paremetru tiek nodoti tālākie parametri.

 

 

Vēl varētu uztaisīt vienkāršu query klasi un implementēt kā ArrayAccess.

 

$q=new query('SELECT * FROM users WHERE username={username} and password={password}');
$q['username']=$username;
$q['pasowrd']=$password;
//vai
$q->setData(array("username"=>$username, "password"=>password));

$q->execute();

Tālāk var šo klasi papildināt ar dažādām execute funkcijām, kuras atgriež vai nu mysqli_result, vai 1.row-a 1.vērtību, vai 1. rowu, vai 2d masīvu ar visu rowu visiem datiem.

 

 

3. variants ir izmantot kādu gatavu vai pašizveidotu ORM.

ORM ideja ir tāda, ka tajā kveriji vispār netiek rakstīti, bet tiek izveidots modelis, kurš nodrošina mapping-u starp PHP objektu un RDBMS datubāzi.

 

Tad katrai tabulai pretī ir viena klase, piemēram:

 

$user = new User();
$user->loadById('5');  //SELECT ....
echo $user->username;
$user->points++;
$user->save();  //UPDATE ...

 

Parasti pilnvērtīgā ORM visi kveriji tiek uzģēnerēti no tavām darbībām ar objektu.

ORM ir viens trūkums, var gadīties iebraukt neoptimāli saģenerētos kverijos, nav īsi iespējams uztaisīt ORM, kurš ģenerētu kverijus 100% visu SQL iespēju.

Edited by codez
Link to comment
Share on other sites

Var jau izmantot kaut kaadu pashveidotu metodi kaa jau codez saka, piemeeram:

 


public static function prepare($sql) {
   	$variable_count = func_num_args() - 1;
   	$variables = func_get_args();
   	$escaped_variables = array();

   	for($i=1; $i<=$variable_count; $i++) {
   		$escaped_variables[] = mysql_real_escape_string($variables[$i]);
   	}

   	$sql = vsprintf($sql, $escaped_variables);

   	return $sql;
}

Link to comment
Share on other sites

Es izmanotju extendotu mysqli klasi, kurai ir dažas funkcijas, kas automātiski escape-o datus un protams Singletona patterns instances iegūšanai, rezultātā kverijus rakstu šādi:

...

Codez - kam par godu izvēlējies tieši mysqli nevis PDO? Vai tādēļ, ka plānoji izmantot tikai mysql, vai bija kādi citi iemesli?

Šobrīd notiek tieši tā nosliekšanās uz vienu vai otru pusi. Pagaidām kaut kā patiešām vairāk velk uz MYSQLi.

Link to comment
Share on other sites

Tagad te papētīju...

Mīnusi:

1) Nav asociatīvo masīvu. Pašam jāpārlisto masīvs

2) Order kolonnas, kas nāk kā mainīgie, tāpat jāapstrādā ar mysql_fetch_array(). Tāpat arī citi mainīgie, kas var apzīmēt kolonnas vaicājumā.

3) Vispirms visam ir jābūt iefetčotam un tikai tad var veikt nākamo selektu.

 

Laikam es īsti nesaskatu PREPARED STATEMENTS ieguvumus...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...