相关疑难解决方法(0)

PDO MySQL:是否使用PDO :: ATTR_EMULATE_PREPARES?

这是我到目前为止所读到的PDO::ATTR_EMULATE_PREPARES:

  1. PDO的准备仿真对性能更好,因为MySQL的本机准备绕过了查询缓存.
  2. MySQL的本机准备更好于安全性(防止SQL注入).
  3. MySQL的本机准备更适合错误报告.

我不知道这些陈述是多么真实.选择MySQL接口时我最担心的是阻止SQL注入.第二个问题是表现.

我的应用程序目前使用过程MySQLi(没有预处理语句),并且使用了很多查询缓存.它很少会在单个请求中重复使用预准备语句.我开始转向PDO以获取已准备好的语句的命名参数和安全性.

我正在使用MySQL 5.1.61PHP 5.3.2

我应该PDO::ATTR_EMULATE_PREPARES启用还是不启用?有没有办法既具有查询缓存的性能又具有预准备语句的安全性?

php mysql pdo

113
推荐指数
7
解决办法
5万
查看次数

如何在LIMIT子句中应用bindValue方法?

这是我的代码的快照:

$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注入安全的.

php mysql sql pdo bindvalue

112
推荐指数
5
解决办法
6万
查看次数

在MySQL查询的LIMIT子句中使用占位符时出现PHP PDO错误

$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,两人都没有工作.

php mysql pdo

8
推荐指数
1
解决办法
702
查看次数

PHP PDO - >准备好的查询返回错误(同样的查询未准备工作正常)

我使用以下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可以帮助我理解.先感谢您.干杯.渣.

php pdo prepared-statement

7
推荐指数
1
解决办法
472
查看次数

使用命名占位符设置PDO/MySQL LIMIT

我遇到了绑定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).

我怎样才能解决这个问题?

php mysql pdo

5
推荐指数
1
解决办法
4841
查看次数

标签 统计

pdo ×5

php ×5

mysql ×4

bindvalue ×1

prepared-statement ×1

sql ×1