1

データベースからデータを動的に取得できるように、すべての選択クエリにphpの関数を使用しています.....それが私のコードが安全で効率的かどうか、またはこれを行うためのより良い方法であるかどうかを知りたかっただけです。正しい方向に向けてください...ありがとう

class mysql {
    private $conn;      
    function __construct(){
                $this->conn= new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
                if( mysqli_connect_errno() )  
                {  
                     trigger_error('Error connecting to host. '.$this->connections[$connection_id]->error, E_USER_ERROR);  
                }
    }
function extracting_data($table, $fields,$condition,$order,$limit){
        $query="SELECT ".$fields."
                FROM ".$table."
                WHERE id =".$this->sql_quote($condition)."
                ORDER BY ".$order."
                LIMIT ".$limit." ";
        //echo $query;
        if($stmt = $this->conn->prepare($query)) {
            $stmt->execute();
            $row = array_pad(array(), $stmt->field_count, '');
            $params = array();
                foreach($row as $k=>$v) {
                  $params[] = &$row[$k];
                }
            call_user_func_array(array($stmt,'bind_result'),$params);
            $result = array();
            while($stmt->fetch()) {
                foreach ($row as $b=>$elem) {
                    $vals[$b]=$row[$b];
                }
                $result[]=$vals;
            }
            $stmt->close();
            return $result;

        }

    }
    function sql_quote( $value )
    {
        if( get_magic_quotes_gpc() )
        {
            $value = stripslashes( $value );
        }
    //check if this function exists
        if( function_exists( "mysql_real_escape_string" ) )
        {
              $value = mysql_real_escape_string( $value );
        }
    //for PHP version < 4.3.0 use addslashes
        else
        {
              $value = addslashes( $value );
        }
        return $value;
    }

}

今私が使用している関数を呼び出す::>

    $connection=New mysql();
$extract=$connection->extracting_data("tablename","id,name,points","$_GET['id']","date desc","0,10");

この関数は、抽出するデータに応じて、 $result に多次元配列を返し、それを $extract に格納します。改善やその他の提案をいただければ幸いです...

4

2 に答える 2

0
  1. 関数のパラメーターがどこから来るのかを監視する必要があります。それらが信頼できないソースからのものである場合、それは非常に安全ではありません.

    誰かが1 ; DROP TABLE tablename ; SELECT * FROM dual WHERE 1パラメータの$conditionようなものを渡すと、Little Bobby Tablesシナリオが得られます。

    • クエリは次のようになります。

      SELECT id, name, points FROM tablename WHERE id ORDER BY DATE DESC LIMIT 0, 10

    idhere は にキャストされ、BOOLEANクエリは と を除くすべての を選択しidます。0NULL

    それは本当にあなたが望むものですか?

    あなたはおそらくあなた$conditionをto'id = $id'またはそのようなものに変更したいと思うでしょう.

    • このレベルの抽象化が本当に必要ですか? 未知のフィールドを持つ未知のテーブルからクエリを生成しますが、構造は事前に定義されてSELECT / FROM / ORDER BY / LIMITいますか?
于 2009-07-15T15:34:47.870 に答える