2015-05-22 26 views
8
$sql = "SELECT sql_calc_found_rows * FROM members". 
     " ORDER BY username LIMIT :startRow, :numRows"; 

try { 
    $st = $conn->prepare($sql); 
    $st->bindParam(":startRow", $startRow, PDO::PARAM_INT); 
    $st->bindParam(":numRows", $numRows, PDO::PARAM_INT); 
    $st->execute(); 
} catch (PDOException $e) { 
    die("Query failed: " . $e->getMessage()); 
} 

LIMIT yan tümcesinde kullanarak tutucular alıyorum hatası:PHP PDO hata MySQL sorgusu İşte

Query failed: 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 ''5'' at line 1.

LIMIT :startRow, :numRows:numRows sorunu vardır.

Her ikisi de işe yaramadı hem de $st->bindParam ve $st->bindValue denedim.

+0

Eğer 'arasındaki inci kapağını kaldırma deneyebilir miyim: StartRow,: $ düzenin numRows' – Jens

+0

değeri? –

+1

SELECT sql_calc_found_rows * FROM ?? bu nedir? –

cevap

-2

Bunu çözdüm. I Type :numRows yer tutucuyu yerleştirdi.

$numRows=(int)$numRows; $sql = 'SELECT sql_calc_found_rows * FROM ' . TBL_MEMBERS .'ORDER BY'. $order .'LIMIT :startRow,:numRows'; try { $st = $conn->prepare($sql); $st->bindValue(":startRow", $startRow, PDO::PARAM_INT); $st->bindValue(":numRows", $numRows, PDO::PARAM_INT); $st->execute();

Ve işe yaradı. Ayrıca ''un " yerine kullanılması gerektiğini de fark ettim.

0

Sorun şu ki, TBL_MEMBERS ile ilgili olduğunu düşünüyorum. Bu bir görünümdür (alt seçim). Yani, örneğin ürün tablosunu varsa ve açıklamaya aşağıdaki yürütmek istiyorsanız: aşağıdaki hatayı alırsınız

select sql_calc_found_rows * from select id, code, name, slug, info from products order by code 

:

select sql_calc_found_rows * from (select id, code, name, slug, info from products) v order by code 
:

SQL Error (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 'select id, code, name, slug, info from products order by code' at line 1

Ama sorguyu değiştirirseniz

bu işe yarayacak.

TBL_MEMBERS parantez koymak ve ben PDO aslında neyin verdiğini SQL sorgu metni bakmak tavsiye

+0

'TBL_MEMBERS' bir tanımdır. 'define (" TBL_MEMBERS "," üye ");' Bence sorun bu değil. –

0

(benim örnek takma 'v' i) diğer adı verilmelidir bir görünümdür Özetlemek gerekirse. Bunu MySQL'in general query log yardımıyla yapabilirsiniz.

Büyük ihtimalle, $startRow ve/veya $numRows biçimsel tipleri dizeleri değil tam sayılardır ve sorguyu çıkan bu nedenle yerine (doğru) LIMIT 0, 5 ait LIMIT '0', '5' (sözdizimi hatası) gibi bir şeydir.

PDO::PARAM_INT ile birlikte, parametrenin resmi türü tamsayı olmadığı zaman bile (is_int, false döndürür), PDO bunu tırnak içine alır. Yani, onları bağlayan önce tamsayılar parametreleri döküm zorunda (örneğin intval kullanarak):

$st->bindParam(":startRow", intval(trim($startRow)), PDO::PARAM_INT); 
$st->bindParam(":numRows", intval(trim($numRows)), PDO::PARAM_INT);