Nasıl tarafından düzen ve sınır hükümleri için PDO'su hazırlanmış deyimi kullanabilirim?

3 Cevap php

Ben geçirilen parametreleri ORDER BY ve LIMIT hükümler, gibi pek için olduğu hazırlanmış bir deyimi kullanmak istiyorum:

$sql = 'SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(
     'sort'  => $_GET['sort'], 
     'dir'  => $_GET['dir'], 
     'start'  => $_GET['start'],
     'results' => $_GET['results'],
     )
    );

Ama $stmt->fetchAll(PDO::FETCH_ASSOC); hiçbir şey döndürür.

Birisi ben yapıyorum yanlış şey ne işaret edebilir? Bu yapılabilir mi? Eğer değilse, ben parametreleri kullanılabilir maddelerinin tam listesi için ne başvuru yapması gerekir?

3 Cevap

: Kullandıktan sonra

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Ben mesajı aldım:

Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1

Eğer çalıştırmak için bir dizi kullandığınızda Yani, LİMİT için iyi bir fikir değil dize olarak girişleri düşünün

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM table ORDER BY :sort :dir LIMIT :start, :results";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':start', $_GET['start'], PDO::PARAM_INT);
$stmt->bindParam(':results', $_GET['results'], PDO::PARAM_INT);
$stmt->bindParam(':sort', $_GET['sort']);
$stmt->bindParam(':dir', $_GET['dir']);
$stmt->execute();

$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($data);

Hazırlanan tablolar DBMS aslında verilen parametreler için sorguyu çalıştırmadan önce sorgu için bir sorgu planı oluşturmak için izin verir. Size verileri farklı şekillerde sipariş ölçüde DBMS verileri almak için tercih edebileceğiniz nasıl etkileyebilir çünkü, ORDER BY, farklı bir sorgu planı gerektirir için alanları değişiyor: Örneğin, bazı indeksler bir durumda yardımcı olmayabilir ama başka. Bu nedenle ORDER BY alanlar yerine önce execute() için sorguya bağlı olmaktan prepare() yöntemi geçirilen SQL dizesi bir parçası olmalıdır.

LIMIT maddesinde gelince, onun parametreleri sorgu planı etkileyecek olup olmadığı açık değil, bu yüzden bu muhtemelen DBMS bağlı olarak, daha sonra bağlı olabilir. Göre this SO answer o izin verilmelidir.

Bir dil anahtar kelime veya bir alan adını belirtmek için bir parametre bağlama olamaz - bu değişmez bir değiştirilmesi gerekmektedir. Bu nedenle, bence senin sınır değerleri gayet iyi, ama zaman sipariş değildir. El dize sıralama ve dir değiştirmek için için iyi olacaktır. Onları Kaçış ancak dize hazır olmadığı için, bunu DB araç kullanmayın. Temelde özel karakterler mevcut olduğundan emin olun.