簡體   English   中英

動態更新語句 - 准備好的語句

[英]Dynamic update statement - prepared statement

我正在 PHP 中動態生成我的 MYSQL 更新語句。 因為我希望我的應用程序對 SQL 注入是安全的,所以我想使用准備好的語句函數。 但由於我很有經驗,我正在努力做到這一點。 到目前為止,在我的代碼下方:

function sqlUpdate($tablename)
    {
        $connect = sqlConnect();
        $updateString = "UPDATE " . $tablename . " SET ";
        $columnname = getColumnname($tablename, false, true);
        
        for ($k=0; $k<count($columnname, COUNT_RECURSIVE); $k++)
        {
            if ($k+1 < count($columnname, COUNT_RECURSIVE))
            {
                $updateString .= $columnname[$k] . " = '" . mysqli_real_escape_string($connect, $_POST[$columnname[$k]]) . "', ";
            }
            else 
            {
                $updateString .= $columnname[$k] . " = '" . mysqli_real_escape_string($connect, $_POST[$columnname[$k]]) . "' WHERE " . $columnname[0] . " = '" . mysqli_real_escape_string($connect, $_POST[$columnname[0]]) . "';";
            }
        }
        
        if(mysqli_query($connect, $updateString))
        {
            echo "Daten wurden erfolgreich aktualisiert! </br>";
        }
        else 
        {
            echo "Es ist ein Fehler aufgetreten... </br>";
        }
        
        mysqli_close($connect); 
    } 

我的代碼目前運行良好,但我無法讓它與准備好的語句一起工作。 我希望我的問題不是太愚蠢。 有人可以分享一些如何用我的代碼實現它的想法,還是我必須完全過度考慮我的方法?

再次抱歉我的菜鳥問題......

謝謝!

感謝所有回答我設法讓它工作的人。 我使用了 call_user_func_array 函數,現在可以在一個函數中為 UPDATE 和 INSERT 生成准備好的語句:

function preparedStatement($tableName, $action)
    {
        $connect = sqlConnect();
        $stmt = $connect->stmt_init();
        $columnname = getColumnname($tableName, false, true);
        
        for ($k=0; $k<count($columnname, COUNT_RECURSIVE); $k++)
        {
            $fielddata[] = $columnname[$k];
            $fieldvalue[] = $_POST[$columnname[$k]];
        }
        if ($action == "insert")
        {
            $fieldvalue[0] = " ";
        }
        
        $fieldvalue_join = implode(',', array_map('addquote', $fieldvalue));
        $fieldvalue = explode(",",$fieldvalue_join);
        $valueCount = count($fieldvalue);
        $question_mark = array();
        
        for($i=0; $i<$valueCount; $i++)
        {
            $question_mark[] = '?';
        } 
        
        $join_question_mark = implode(",", $question_mark);
        $types = '';  
        
        foreach($fieldvalue as $param) 
        {        
            if(is_int($param)) 
            {
                $types .= 'i';              //integer
            } 
            elseif (is_float($param)) 
            {
                $types .= 'd';              //double
            } 
            elseif (is_string($param)) 
            {
                $types .= 's';              //string
            } 
            else 
            {
                $types .= 'b';              //blob and unknown
            }
        }
        
        if ($action == "insert")
        {
            $insertString = "INSERT INTO ".$tableName."(".implode(",",$fielddata).") VALUES (".$join_question_mark.");";
            $stmt->prepare($insertString);
            $bind_names[] = $types;
        }
        elseif ($action == "update")
        {
            $updateString = "UPDATE " . $tableName . " SET ";
            
            for ($k=0; $k<count($columnname, COUNT_RECURSIVE); $k++)
            {
                if ($k+1 < count($columnname, COUNT_RECURSIVE))
                {
                    $updateString .= $columnname[$k] . " = ?, ";
                }
                else 
                {
                    $updateString .= $columnname[$k] . " = ? WHERE " . $columnname[0] . " = '" . mysqli_real_escape_string($connect, $_POST[$columnname[0]]) . "';";
                }
            }
            
            $stmt->prepare($updateString);
            $bind_names[] = $types;
        }
        
        for ($i=0; $i<count($fieldvalue); $i++) 
        {
            $bind_name = 'bind' . $i;       
            $$bind_name = $fieldvalue[$i];
            $bind_names[] = &$$bind_name;   
        }
        
        call_user_func_array(array($stmt,'bind_param'),$bind_names);

        if($stmt->execute())
        { 
            $insert_id=$stmt->insert_id;
            $stmt->close();
            return $insert_id;
        }
        else
        {
            echo "Fehler beim Ausführen der Aktion...";
        }
    }
     
     function addquote($str)
     {
        if($str[0]=="'" || $str[0]=='"' && $str[strlen($str)-1]=="'" || $str[strlen($str)-1]=="'" )
        {
            $str=substr($str,1);
            $str=substr($str,0,-1);
        }
        return sprintf("%s", $str);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM