V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
iamverylovely
V2EX  ›  问与答

小白寻找懂 PHP 的大佬,在下有点问题想请教。。

  •  
  •   iamverylovely · 2020-05-29 12:22:20 +08:00 · 1348 次点击
    这是一个创建于 1399 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问 php 这样操作数据库稳(安全)吗?,并发不大,体验要求也不高,百来人(使用人数),如果行的话,我就要开始咯。

    
    function db_conn($sql) {
    	$SqlConn = new PDO("mysql:host=localhost;dbname=test", "root", "ll1314");
    	$SqlConn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    	$IsQuery = $SqlConn->prepare(array_shift(($sql)));
    	$IsChange=$IsQuery->execute($sql);
    	$ArrayResult = $IsQuery->fetchAll();
    	return !empty($ArrayResult)?$ArrayResult:$IsChange;
    }
    
    $sql=Array("select * from isuser where uid=?","42");
    
    //$sql=Array("INSERT INTO `test`.`isuser`(`user`, `passwd`, `nickname`) VALUES (?, ?, ?)","testUser","pass","iamverylovely");
    
    var_dump(db_conn($sql));
    
    
    第 1 条附言  ·  2020-05-29 12:58:07 +08:00
    
    //dbHelper
    function db_conn($sql) {
    	$SqlConn = new PDO("mysql:host=localhost;dbname=test", "root", "ll1314");
    	$SqlConn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    	$IsQuery = $SqlConn->prepare(array_shift(($sql)));
    	for($i=0;$i<count($sql);$i++){
    		$IsQuery->bindValue($i+1,$sql[$i]);
    	}
    	$IsChange=$IsQuery->execute();
    	$ArrayResult = $IsQuery->fetchAll();
    	return !empty($ArrayResult)?$ArrayResult:$IsChange;
    }
    
    $sql=Array("select * from isuser where uid=:uid","43");
    
    //$sql=Array("INSERT INTO `test`.`isuser`(`user`, `passwd`, `nickname`) VALUES (:user, :passwd, :nickname)","testUser","pass","iamverylovely");
    
    var_dump(db_conn($sql));
    
    

    改成了这样,应该没什么问题了吧

    第 2 条附言  ·  2020-05-31 13:40:00 +08:00

    想了一下,我的应用场景用了单例模式意义也不大

    db_conn() 这个方法每次请求接口只执行一次
    
    不会出现下面的情况
    db_conn()
    db_conn()
    ...
    

    谢谢大家的帮助拉~~~

    14 条回复    2020-05-29 14:16:41 +08:00
    iamverylovely
        1
    iamverylovely  
    OP
       2020-05-29 12:25:50 +08:00
    在线等摸鱼程序员出现。
    iamverylovely
        2
    iamverylovely  
    OP
       2020-05-29 12:26:51 +08:00
    打开浏览器,关闭浏览器,刷新,刷新!
    sanggao
        3
    sanggao  
       2020-05-29 12:28:14 +08:00
    可以 pdo 绑定可以有效防止注入
    iamverylovely
        4
    iamverylovely  
    OP
       2020-05-29 12:37:31 +08:00
    @sanggao 好的,我去试试。。
    nyfwan123
        5
    nyfwan123  
       2020-05-29 12:59:20 +08:00
    return 容易暴露异常,建议优化。
    iamverylovely
        6
    iamverylovely  
    OP
       2020-05-29 13:03:55 +08:00
    @nyfwan123 error_reporting(0) 可以忽略掉那些异常吗
    nyfwan123
        7
    nyfwan123  
       2020-05-29 13:05:25 +08:00
    @iamverylovely 可以忽略 但是与你预期的返回值不符了 最好函数里捕获异常 再 return
    nyfwan123
        8
    nyfwan123  
       2020-05-29 13:08:51 +08:00
    @iamverylovely 或者参考#3 所说 你去看一下官方文档有 pdo 的示例 或者直接引用诸如 medoo 的第三方库。
    iamverylovely
        9
    iamverylovely  
    OP
       2020-05-29 13:09:27 +08:00
    @nyfwan123 好的,谢谢。
    icyluna
        10
    icyluna  
       2020-05-29 13:24:16 +08:00 via iPhone
    推荐 medoo 真心好用
    ccppgo
        11
    ccppgo  
       2020-05-29 13:55:35 +08:00
    http://doc.workerman.net/components/workerman-mysql.html 这个类库封装的也不错, 10 楼推荐的 medoo 感觉 where 是真心别扭(对于习惯 ORM 的人来说)
    DavidNineRoc
        12
    DavidNineRoc  
       2020-05-29 13:56:30 +08:00
    1. 把 pdo 封装成单例,不要每次查询一个新连接
    2. 不要 fetchAll, 直接 fetch, 如果要全部才 fetchAll. 区分只拿一条和多条的区别.(或者你在 SQL 显式写 limit 1,很多人不喜欢写,但很重要.)
    yc8332
        13
    yc8332  
       2020-05-29 14:09:50 +08:00
    至少搞个单例吧。。不然操作 10 次数据库,建了 10 个实例
    iamverylovely
        14
    iamverylovely  
    OP
       2020-05-29 14:16:41 +08:00
    @DavidNineRoc
    @yc8332 好的,摸鱼怪们
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1547 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:13 · PVG 01:13 · LAX 10:13 · JFK 13:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.