iamverylovely
V2EX  ›  问与答

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

  •  
  •   iamverylovely · May 29, 2020 · 1805 views
    This topic created in 2195 days ago, the information mentioned may be changed or developed.

    请问 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));
    
    
    Supplement 1  ·  May 29, 2020
    
    //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));
    
    

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

    Supplement 2  ·  May 31, 2020

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

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

    谢谢大家的帮助拉~~~

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