php mysql PDO的使用 及limit分页查询失败问题修改

一、链接数据库

$config_invite['database'] = array(
    'dsn'      => 'mysql:dbname=game;host=127.0.0.1;charset=utf8',
    'user'     => 'root',
    'password' => ''
);

try {
    $db = new PDO($config_invite['database']['dsn'], $config_invite['database']['user'], $config_invite['database']['password']);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    exit;
}

二、查询之query,会返回一个对象直接打印是不显示的,可以用循环打印出数据

$sql = 'select id,player from Delete_log';

$of = $db->query($sql);

foreach ($of as $k) {

    var_dump($k['id']);
    var_dump($k['player']);

    exit;
}

结果像这样

查询之prepare execute fetchAll 组合用法

prepare:准备要执行的SQL语句并返回一个 PDOStatement 对象

execute:执行一条预处理语句 可以替换变量 参考手册 https://www.runoob.com/php/pdostatement-execute.html

fetchAll:返回一个包含结果集中所有行的数组

fetch:从结果集中获取下一行

$sql = 'select id,player from Delete_log where id=:id';
$sth = $db->prepare($sql);
$sth->execute([':id'=>1]);
$data_list = $sth->fetchAll(PDO::FETCH_ASSOC);

var_dump($data_list);

三、execute执行limit分页数据的时候会出现bug,可用如下方法解决

$sql = 'select id,player from Delete_log limit :page, :list_rows';

$exe[':page']      = 0;
$exe[':list_rows'] = 10;

$sth = $db->prepare($sql);
foreach ($exe as $key => $value) {
    $sth->bindValue($key, $value, select_data_type($value));
}
$sth->execute();
$list = $sth->fetchAll(PDO::FETCH_ASSOC);

var_dump($list);

//修改数据类型用于execute limit查询bug
function select_data_type($val)
{
    if (is_bool($val)) {
        return PDO::PARAM_BOOL;
    } elseif (is_int($val)) {
        return PDO::PARAM_INT;
    } elseif (is_null($val)) {
        return PDO::PARAM_NULL;
    } else {
        return PDO::PARAM_STR;
    }
}

跟这个一个道理,意思就是好像他会吧分页的变量变成字符串从而导致查询失败,所以强制转成int类型

$sql = 'select id,player from Delete_log limit :page, :list_rows';

$sth = $db->prepare($sql);
$sth->bindValue(':page', (int) 0, PDO::PARAM_INT);
$sth->bindValue(':list_rows', (int) 10, PDO::PARAM_INT);
$sth->execute();
$list = $sth->fetchAll(PDO::FETCH_ASSOC);

var_dump($list);

这样就可以确保分页查询bug问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值