Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Funktion SQL-Filter übergeben

    webald

    • modified Team
    • Beiträge: 2.791
    Funktion SQL-Filter übergeben
    am: 23. Oktober 2017, 18:37:36
    Ich möchte eine Code etwa wir folgt haben:
    Code: PHP  [Auswählen]
    function GetWebaldCategories($filter='') {
        ....
        $where = $filter
        ....
        $sql=mysql_query("SELECT * FROM categories " .$where);
        ....               
    }
     

    $filter könnte z. B. sein:
    Code: PHP  [Auswählen]
    $filter="categories_status = 0 AND parent_id = 5"

    Wie validiere ich das denn am besten?

    Linkback: https://www.modified-shop.org/forum/index.php?topic=38141.0

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Funktion SQL-Filter übergeben
    Antwort #1 am: 24. Oktober 2017, 18:52:41
    Nachdem hier wohl auch niemad eine gute Idee hat, habe ich es nun anders gelöst - sicher, aber mit Verzicht auf Flexibilität.

    Für die Interessierten:
    Code: PHP  [Auswählen]
    class WebaldCategory extends Catalog{

            private $user_id;
            ...
            function GetWebaldCategories($startrow=0, $transrow=0, $filters='', $filtertype='AND', $filteraction='=') {
                    $result = array();
                    // include helper-functions and check if user_id is allowed to access this function
                    include_once(DIR_WS_API_LOGIC . 'functions/'.'helper_functions.php');
                    if (APIsValidateUser($this->user_id)){ 
                            $tablerows = $this->GetCategoriesCount();
                            if($transrow == 0){
                                    $transrow =  $tablerows; // Could run into timeout-error, because to much rows
                            }
                            if ($startrow >= $tablerows){
                                    // no rows to select, use 0 as start
                                    $startrow = 0;
                            }
                            if ($filters=''){
                                    $where = '';
                            }else{
                                    $valid_datafields = GetSQLColumns(TABLE_CATEGORIES);
                                    $where = ' WHERE '. ValidateAndBuildSQLFilter($filters, $filtertype, $filteraction, $valid_datafields);
                            }
                            $sql=mysql_query("SELECT categories_id, categories_item_category, categories_product_group, categories_external_cat_id, categories_background_image
                                    FROM "
    . TABLE_CATEGORIES . $where . " limit " .$startrow. "," . $transrow);                   
                            if (xtc_db_num_rows($sql)){
                                    while ($row = xtc_db_fetch_array($sql)) {
                                            $result[] = $row;
                                    }
                            }
                    }
                    return $result;
            }
    }
    $filter ist ein Array und enthält Spalte und zu suchenden Wert.

    Code: PHP  [Auswählen]
    function ValidateAndBuildSQLFilter($filters, $filtertype='AND', $filteraction='=', $valid_datafields){
           
            $filterresult = "";
            switch($filteraction){
                    case 'exact':
                    case '=':
                            $filteraction ='=';
                            break;
                    case 'like':
                    case 'similar':
                            $filteraction = 'LIKE';
                            break;
                    default:
                            $filteraction ='=';
            }
           
            if (is_array($filters)){
                    foreach($filters as $filter){
                            if(is_array($filter)){
                                    foreach($filter as $key=>$data){
                                            $sqlcolumncheck = in_array($key, $valid_datafields);
                                            if($sqlcolumncheck == true){
                                                    if(strlen($filterresult) = 0){
                                                            $filterresult .= $key . " ". $filteraction. " '". xtc_db_input($data)."'";
                                                    }else{
                                                            $filterresult .= " ".$filtertype. " " . $key . " ". $filteraction. " '". xtc_db_input($data)."'";
                                                    }      
                                            }
                                    }
                            }
                    }
            }
            return $filterresult;
    }

    function GetSQLColumns($datatable){
           
            $result=array();
            $sql = xtc_db_query("SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME = '" . xtc_db_input($datatable). "' AND TABLE_SCHEMA = '".DB_DATABASE."'");
            if (xtc_db_num_rows($sql)){
                    while ($row = xtc_db_fetch_array($sql)) {
                            $result[] = $row;
                    }
            }
            return $result;
    }
    0 Antworten
    2358 Aufrufe
    31. Dezember 2014, 12:03:24 von manne35
    2 Antworten
    2410 Aufrufe
    19. April 2016, 16:59:25 von newbee79
    5 Antworten
    3784 Aufrufe
    14. Oktober 2011, 19:33:05 von Tomcraft
    2 Antworten
    7874 Aufrufe
    19. März 2012, 15:18:43 von fishnet
               
    anything