PDO parametreleri geçirmek için güzel bir yol

3 Cevap php

Fazla 3 veya 4 parametreleri ile uğraşırken konumsal parametreleri bir kabus haline gelir. Adlandırılmış parametreleri ayrıntılı vardır. Ben bunu düşünüyorum:

query("SELECT * FROM users WHERE username = ", $username, " AND password = ", $password)

Dinamik parametrelerin (func_get_args() kullanarak) ile, her saniye bir konumsal parametre haline dönüşüyor.

Ben daha önce görmüş ve herkes önce bu yapılır ve neden / neden olup olmadığını bilmek istedim hiç?

3 Cevap

Bu akıllıca bir fikir. Gördüğüm tek sorun SQL ve geçirilen değişkenler arasındaki ayrım nasıl. Eğer her saniye arg bir değişken olduğunu bir varsayım yapmak sürece. Ben sadece varsayım kırılgan, ve şeyleri onlara açıkça daha obfuscates düşünüyorum.

Iyi yolu muhtemelen interpolasyon kullanmak olacaktır:

query("SELECT foo FROM bar WHERE id = #{id}",  array("id" => "23"));

Daha sonra bu katmak için mantığı yazmak.

Adını parametreler en az konumsal parametrelere göre değil, ayrıntılı olması gerekmez. Hala ortada kısaltılmış versiyonlarını kullanabilirsiniz:

$st = $dbh->prepare('SELECT * FROM users WHERE username = :u AND password = :p');
$st->bindValue(':u', $username);
$st->bindValue(':p', $password);
$st->execute();

Ben konumsal parametreler kadar kötü olduğunu sanmıyorum ... Bu benim en sevdiğim yöntem:

function mysql_safe_string($value) {
	if(is_numeric($value))      return $value;
	elseif(empty($value))       return 'NULL';
	elseif(is_string($value))   return "'".mysql_real_escape_string($value)."'";
	elseif(is_array($value))    return implode(',',array_map('mysql_safe_string',$value));
}

function mysql_safe_query($format) {
	$args = array_slice(func_get_args(),1);
	$args = array_map('mysql_safe_string',$args);
	$query = vsprintf($format,$args);
	$result = mysql_query($query);
	if($result === false) echo '<div class="mysql-error"><strong>Error: </strong>',mysql_error(),'<br/><strong>Query: </strong>',$query,'</div>';
	return $result;
}

// example
$result = mysql_safe_query('SELECT * FROM users WHERE username=%s', $username);