SELECT id, content, date
FROM comment
WHERE post = ?
ORDER BY date DESC
LIMIT ?, ?
Run Code Online (Sandbox Code Playgroud)
使用PDO(我正在使用具有Apache 2.2.21的MAMP 2.0.5,PHP高达5.3.6和MySQL 5.5.9)准备语句这不起作用,如果我更改查询
LIMIT 0, 10
Run Code Online (Sandbox Code Playgroud)
有用.
我在MySQL的错误中看到这是以前版本中的一个错误,但我无法理解这是否仍有待修复.
如果这仍然是个问题,有办法以另一种方式选择一系列行吗?
码:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Run Code Online (Sandbox Code Playgroud) $sql = "SELECT * FROM table WHERE id LIKE CONCAT('%', :id, '%')
LIMIT :limit1, :limit2";
Run Code Online (Sandbox Code Playgroud)
我想仍然像这样使用数组输入:
$stmt->execute($array);
Run Code Online (Sandbox Code Playgroud)
否则我不能重复使用相同的方法来执行我的查询.
同时,:limit1和:limit2不起作用,除非它像这样输入:
$stmt->bindParam(':limit1', $limit1, PDO::PARAM_INT);
Run Code Online (Sandbox Code Playgroud)
我试图做两个但它不使用bindParams执行:
$stmt->bindParam(':limit2', $limit2, PDO::PARAM_INT);
$stmt->execute($array);
Run Code Online (Sandbox Code Playgroud)
它的方法是什么?
我以为我可以扩展PDOStatement并添加一个新方法"bindLimit"或其他东西,但我无法弄清楚PDO使用什么内部方法将参数绑定到变量.
我想使用一个准备好的语句,其中传入的参数用于ORDER BY和LIMIT子句,如下所示:
$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'],
)
);
Run Code Online (Sandbox Code Playgroud)
但$stmt->fetchAll(PDO::FETCH_ASSOC);什么都不回报.
有人能指出我在做什么是错的吗?可以吗?如果没有,我应该参考哪些条款的完整列表可以使用参数?
我在我的应用程序中使用PDO.但是当我在包含的查询中使用预准备语句时,我遇到了问题LIMIT.有什么问题?
代码:
$start = 0;
$rows = 20;
$sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?";
$q = $db->prepare($sql);
$q->execute(array($start , $rows));
Run Code Online (Sandbox Code Playgroud)
错误:
检查与MySQL服务器版本对应的手册,以便在"0","20"附近使用正确的语法
$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());
}
Run Code Online (Sandbox Code Playgroud)
我在这里得到错误:
查询失败:SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法中有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的"5"附近使用正确的语法.
该LIMIT :startRow, :numRows中有问题:numRows.
我曾经尝试都$st->bindParam和$st->bindValue,两人都没有工作.
可能重复:
LIMIT中的PHP PDO bindValue
在准备语句中使用LIMIT和/或OFFSET时我无法显示数据,但如果我不使用LIMIT和OFFSET,我可以显示"雷雷",代码看起来是错误的吗?
$statement = $conn->prepare("SELECT id,username FROM public2 WHERE username = :name LIMIT :sta OFFSET :ppage");
$name = "Lei Lei";
$statement->execute(array(':name' => $name,':sta' => $start,':ppage' => $per_page));
Run Code Online (Sandbox Code Playgroud)
这已经从原来的代码改变了:
$query_pag_data = "SELECT id,username from public2 LIMIT $start, $per_page";
$result_pag_data = mysql_query($query_pag_data) or die('MySql Error' . mysql_error());
Run Code Online (Sandbox Code Playgroud) 我遇到了绑定LIMITSQL查询部分的问题.这是因为查询是作为字符串传递的.我在这里看到另一个Q处理绑定参数,没有任何处理数组中的命名占位符.
这是我的代码:
public function getLatestWork($numberOfSlides, $type = 0) {
$params = array();
$params["numberOfSlides"] = (int) trim($numberOfSlides);
$params["type"] = $type;
$STH = $this->_db->prepare("SELECT slideID
FROM slides
WHERE visible = 'true'
AND type = :type
ORDER BY order
LIMIT :numberOfSlides;");
$STH->execute($params);
$result = $STH->fetchAll(PDO::FETCH_COLUMN);
return $result;
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:Syntax error or access violation near ''20''(20是值$numberOfSlides).
我怎样才能解决这个问题?
PDO 似乎会在准备好的 sql 语句中自动为绑定参数添加引号。
当我试图限制结果数量时,我不想要这个功能,因为这应该被视为 mysql 的整数。
function fixStatistics($metal, $currency, $months){
$db = connectPDO();
$sql = '
SELECT [COLUMN NAMES]
FROM [TABLE NAMES]
WHERE [WHERE STUFF]
GROUP BY `Month`
ORDER BY MONTH(DateStamp) LIMIT :numMonths
';
$stmt = $db->prepare($sql);
$stmt->execute(
array(
':metal' => $metal,
':currency' => $currency,
':numMonths' => $months // Problem Code
)
);
$statistics = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $statistics;
}
Run Code Online (Sandbox Code Playgroud)
我可以通过手动注入/连接 sql 语句来解决这个问题 - 这不是我想要做的。
ORDER BY MONTH(DateStamp) LIMIT ' . $numMonths
Run Code Online (Sandbox Code Playgroud)
但是有没有办法将 :numMonths 直接转换为 int 点$stmt->execute();?
我有这样的查询:
SELECT imageurl
FROM entries
WHERE thumbdl IS NULL
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
它与PDO和MySQL Workbench完美配合(它可以根据需要返回10个URL).
但是我尝试LIMIT使用PDO 进行参数化:
$cnt = 10;
$query = $this->link->prepare("
SELECT imageurl
FROM entries
WHERE imgdl is null
LIMIT ?
");
$query->bindValue(1, $cnt);
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
返回空数组.
我试图限制从SQL查询返回的结果数量,但由于某种原因它返回NULL.如果我删除LIMIT,一切正常.我在Sequel Pro中测试了这个查询,它也适用于LIMIT.我在这里做错了吗?
public static function getMostViewedPictures($limit = 5) {
$dbh = self::connectToDatabase();
$sql = "SELECT
picture.`title`,
picture.`description`,
picture.`slug`,
picture.`image`,
picture.`timestamp`,
picture.`views`,
category.category as category
FROM picture
LEFT JOIN category
ON picture.category_id = category.id
ORDER BY picture.views ASC
LIMIT 0, :limit";
$sth = $dbh->prepare($sql);
$sth->execute(array(':limit' => $limit));
if($results = $sth->fetchAll(PDO::FETCH_OBJ)) {
$pictures = array();
foreach($results as $result) {
$pictures[] = new Picture(
$result->title,
$result->description,
$result->slug,
$result->timestamp,
$result->category,
$result->views,
$result->image
);
}
return $pictures;
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)