这是我到目前为止所读到的PDO::ATTR_EMULATE_PREPARES:
我不知道这些陈述是多么真实.选择MySQL接口时我最担心的是阻止SQL注入.第二个问题是表现.
我的应用程序目前使用过程MySQLi(没有预处理语句),并且使用了很多查询缓存.它很少会在单个请求中重复使用预准备语句.我开始转向PDO以获取已准备好的语句的命名参数和安全性.
我正在使用MySQL 5.1.61和PHP 5.3.2
我应该PDO::ATTR_EMULATE_PREPARES启用还是不启用?有没有办法既具有查询缓存的性能又具有预准备语句的安全性?
这是我的代码的快照:
$fetchPictures = $PDO->prepare("SELECT *
FROM pictures
WHERE album = :albumId
ORDER BY id ASC
LIMIT :skip, :max");
$fetchPictures->bindValue(':albumId', $_GET['albumid'], PDO::PARAM_INT);
if(isset($_GET['skip'])) {
$fetchPictures->bindValue(':skip', trim($_GET['skip']), PDO::PARAM_INT);
} else {
$fetchPictures->bindValue(':skip', 0, PDO::PARAM_INT);
}
$fetchPictures->bindValue(':max', $max, PDO::PARAM_INT);
$fetchPictures->execute() or die(print_r($fetchPictures->errorInfo()));
$pictures = $fetchPictures->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
我明白了
您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的"15",15'附近使用正确的语法
似乎PDO在SQL代码的LIMIT部分中为我的变量添加单引号.我查了一下我发现了这个我认为相关的错误:http: //bugs.php.net/bug.php?id = 44639
这就是我在看的东西吗?这个bug自2008年4月开始!在此期间我们应该做什么?
我需要构建一些分页,并且需要在发送sql语句之前确保数据是干净的,sql注入安全的.
$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,两人都没有工作.
我使用以下sql来获取que_id我的表的特定行的字段的值值,它工作正常.请注意,que_id(自动递增)和行号不一样.
$qry_que_getid = $connexion->query('SELECT somefield FROM table ORDER BY somefield ASC LIMIT '.$lineNumberSeeked.', 1');
$row = $qry_que_getid->fetch(PDO::FETCH_ASSOC);
echo $row['que_id'];
Run Code Online (Sandbox Code Playgroud)
当我尝试将该查询转换为准备好的查询,如下所示我有一个错误,我没有得到它:
$qry_que_getid = $connexion->prepare('SELECT somefield FROM table ORDER BY somefield ASC LIMIT ?, 1');
$qry_que_getid->execute(array(4));
$row = $qry_que_getid->fetch(PDO::FETCH_ASSOC);
echo $row['que_id'];
Run Code Online (Sandbox Code Playgroud)
我收到以下错误 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 ''3', 1' at line 1
希望somene可以帮助我理解.先感谢您.干杯.渣.
我遇到了绑定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).
我怎样才能解决这个问题?