从 mysqli 更改为 pdo

2023-12-13

我对这段代码没有问题,它出奇地工作正常,但我真的不明白它是如何工作的,甚至不明白它是否正确,所以:

我对 mysqli 进行 ajax post 或 get 调用的查询如下:

$con = mysqli_connect('localhost','root','','db') or die(header('Location: ./404.php'));
$add = "INSERT INTO table (id, id2, id3) VALUES('','$fid','')";
            if(mysqli_query($con, $add)){
                echo "added";
                }
$remove = "DELETE FROM table WHERE id2='$fid'";
            if(mysqli_query($con, $remove)){
                echo "removed";
            }
$getInfo = "SELECT * FROM table";
            $result = $con->query($getInfo);
            if($result->num_rows > 0) {
                while($row = $result->fetch_assoc()){
                   //do something
                } 
            }

And for $_POST or $_GET values I used mysqli_real_escape_string

这里转换成PDO:

try{
$con = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

$get = $con->query("SELECT * FROM table");
    foreach($get->fetchAll(PDO::FETCH_ASSOC) as $row){
                    $data['0'] = $row['name'];
                    $data['1'] = $row['email'];
                    return $data;
                }

$add = $con->prepare("INSERT INTO table (id, id2, id3) VALUES(:f1,:f2,:f3)");
            $add->execute(array(':f1' => '', ':f2' => $fid, ':f3' => ''));
            echo "added";

$remove = $con->prepare("DELETE FROM table WHERE id2=:f1");
            $remove->bindValue(':f1', $fid, PDO::PARAM_STR);
            $remove->execute();
                echo "removed";

}catch(PDOException $ex){
    echo "error";
}

现在这可以工作,但我真的不知道它是否用 pdo 正确编写,我不需要使用 mysqli_real_escape_string 之类的东西与 mysqli 或类似的东西。 我在网上能找到的就是它现在是如何编写的,代码的哪一部分在做什么,例如当我在 mysqli 中使用插入、更新或删除时我使用

if(mysqli_query($con, $sql)){echo "success";}else echo 'fail';

我怎样才能用 pdo 做到这一点? 而且对于使用 try 和 catch 我不知道我是否需要在每个查询中使用它或者像我上面添加的那样?

只是再说一遍,我是 pdo 的新手,我不太理解它,上面的代码可以工作,但我不知道它是否以正确的方式编写?


首先,让我祝贺您选择 PDO。在我认识的所有经验丰富的 PHP 开发人员中,几乎一致认为他们更喜欢 PDO 而不是 mysqli。

我强烈推荐你通读本指南使用 PDO。它应该回答您所有的问题,甚至回答您将来可能遇到的一些问题。

对于您的具体问题:

不,只要您使用带有占位符的准备好的语句,您就不需要再转义任何内容。转义的存在正是因为人们将变量插入到 SQL 语句中,这可能会混淆包含字符串所需的引用。

有了prepared statements,这个问题就不再存在,这也意味着不再有SQL注入的危险。 SQL 注入利用字符串连接将原始 SQL 语句转换为完全不同的语句,同样使用引号,这就是为什么从用户输入接受的非转义字符串是 SQL 注入的攻击向量。这两个问题都可以使用参数和准备好的语句来解决。

至于 PDO 的错误处理,您想利用PDO::ERRMODE_EXCEPTION所讨论的在此处的手册中.

不幸的是,PDO 的默认值是PDO::ERRMODE_SILENT它本质上会忽略数据库错误,只设置您必须自己检查的 PDO 对象变量。

话虽如此,您可以通过在创建 PDO 连接对象时或之后添加错误模式来解决此问题。示例位于我链接的 PDO 错误模式页面上。

对于 Try-Catch 块,一般来说,您不想专门捕获异常,除非您有一些功能代码来解决错误。仅仅为了报告错误消息而包装每个 sql 调用是不好的,无论是从 DRY 的角度来看还是从反模式的角度来看。使用正确的错误模式,SQL 错误将抛出异常,您可以在错误处理程序中处理这些异常,并且通常是您不应该消耗并继续处理的异常。

您的错误处理程序应该(在生产中)将错误记录到磁盘/向系统管理员或站点所有者发送电子邮件,并显示专业的非特定错误消息,通知用户问题以及所有异常都应该发生的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 mysqli 更改为 pdo 的相关文章

  • 如何通过键查找最大和最小日期

    我有一个数组 a array 2010 05 03 gt 100 2010 05 04 gt 400 2008 05 01 gt 800 2011 01 01 gt 800 我如何找到最大值和最小值key date 例如 max gt 20
  • 在 symfony2 中为特定控制器设置 max_execution_time

    Using ini set 我可以扩展最大执行时间一个脚本的 在Symfony2 我可以添加ini set to web app php and web app dev php将增加的执行时间应用于所有控制器 但在这种情况下 我只想扩展最大
  • 如何从 Laravel 5 中的 Public/Images 文件夹中删除图像(URL 数据)

    如何从 laravel 5 中的 public images 文件夹中删除图像文件 我从这个网站找到了一些例子 但我知道他们只是在他们的文件中使用文件名record table 但我正在使用类似的东西URL e g localhost pr
  • Symfony php.ini Debian

    我在 Oracle VM VirtualBox 上使用 Debian 7 amd64 LAMP 服务器 我正在尝试安装 Symfony 但遇到了一些小问题 当我运行命令时 php my project name app check php
  • PHP 警告 ZipArchive::extractTo():权限被拒绝

    我创建了一个应用程序 它使用 ZipArchive 类 php 中的标准 中的方法 extractTo 并在 Windows 7 上的本地主机 apache 服务器上对其进行了测试 没有任何问题 但是当我在一些unix生产服务器上尝试过它之
  • PSR-4 代码库中条令生成器的解决方法

    在 Windows 机器上使用 Symfony 2 和 Doctrine 我正在尝试 从现有模式生成实体 php app console doctrine mapping import force CoreBundle annotation
  • 如何从字符串中只获取数字? [复制]

    这个问题在这里已经有答案了 我有这样的字符串 第 001 课 完成 在这种情况下 我只想获取数字部分001 我试过这个 str the title preg match all d str matches number implode ma
  • PHP 中的正则表达式:找到第一个匹配的字符串

    我想在非常长的文本中找到第一个匹配的字符串 我知道我可以使用 preg grep 并获取返回数组的第一个元素 但是 如果我只需要第一场比赛 或者我知道提前只有一场比赛 那么这样做效率不高 有什么建议吗 预匹配 http www php ne
  • WooCommerce:用文本覆盖购物车价格

    我们有很多产品具有以下功能 No price 零价格 我们让它们可以通过内置挂钩购买 但购物车仍然将它们显示为具有0 price结账时 我们希望购物车和结帐摘要显示 特殊订单 或任何其他文本 但 WooCommerce 似乎使基于文本的价格
  • Propel Query 中的动态表名称

    我想知道您是否可以使 propel 查询的表名称动态化 有点像变量 一个例子类似于 DynamicVar Query create 我让它在 ifs 中工作 就像下面的例子一样 但如果更动态地制作 可以删除相当多的行 这些表的设置都是相同的
  • 如何在 Laravel 5 中处理嵌套的 JSON 对象请求?

    我们在 Laravel 5 和 AngularJs Ionic 中运行此 Web 服务来处理 Web 当我们将请求从 Web 客户端 发送到 Web 服务 后端 时 我们传递了嵌套的 JSON 对象 我们在读取服务器端父对象下的所有子对象时
  • CSV 从 UTF8 到 ISO-8859-1

    我正在尝试修改我的 CSV 导出 但它不会将我的 CSV 从 UTF 8 转换 保存为 ISO 8859 1 请问我做错了什么吗 实际上自从修改了这个之后 我得到了一个空的 CSV 文件 php 7 0 x function my Gene
  • Yii2 DropDownList Onchange 更改自动完成小部件“源”属性?

    我已经尝试过这个 yii2 依赖的自动完成小部件 https stackoverflow com questions 27025791 yii2 dependent autocomplete widget 但我不知道为什么它不起作用 这是我
  • cURL '格式错误的网址'

    This url 在浏览器中工作得很好 但 cURL 返回错误 3 格式错误的 url 关于解决方法有什么想法吗 EDIT 卷曲代码 function get web page url options array CURLOPT RETUR
  • 使用 DOM 获取 div 的内容(包括子标签)

    我正在使用 DOM 来获取 div 标签的内容 但内部 html 部分未显示 功能是 dom new DOMDocument libxml use internal errors true dom gt loadHTMLFile url l
  • 疯狂的 crond 行为。不断使 bash 进程失效

    我有一个看起来像这样的 crontab SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 0 59 var www html private fivemin zda
  • ZF2 工厂获取参数

    我有一个动态类别导航 在导航工厂中 我想从路线获取参数 我怎样才能做到这一点 在我看来 在我的 module php 中 public function getServiceConfig return array factories gt
  • $_SESSION 中保存大量信息可以吗?

    我需要存储许多数组 SESSION以防止从 MySQL 检索信息 可以吗 其中 太多 的信息有多少 SESSION还是没有 太多 谢谢 附 或者更好地使用http php net manual en book memcache php ht
  • sqlsrv_num_rows 不返回任何值

    我正在尝试获取查询中返回的行数 while 循环遍历结果有效 但由于某种原因 sqlsrv num rows 不返回任何值 result SELECT from dtable WHERE id2 apple query sqlsrv que
  • Laravel 5 注销特定用户

    在我的 laravel 5 应用程序中 有一个功能允许具有管理员角色的用户重置非管理员的任何人的密码 但这不会强制该人注销并再次登录 更改密码后如何强制用户注销 我没有对用于验证用户身份或任何内容的中间件进行任何更改 我不知道它是否有效 但

随机推荐