2017-06-11 4 views
-1

Gibt es eine Möglichkeit, etwas ähnliches wie dieses Beispiel zum Arbeiten in mysql zu machen?mysql (sehr) dynamisch vorbereitete Anweisung

SET @my_columns = "(col_1 , col_2 , col_n)"; 
SET @my_values = "(val_1 , val_2 , val_n)"; 

SET @vs_query = "INSERT INTO my_table ? VALUES ? "; 

PREPARE stmt FROM @vs_query; 
EXECUTE stmt USING @my_columns , @my_values; 
DEALLOCATE PREPARE stmt; 
+2

Diese Art von Problem ist symptomatisch für schlechtes Design – Strawberry

+1

@ Strawberry Ich denke, aufgrund meiner mangelnden Erfahrung haben Sie recht. Aber ich verstehe das nicht, denn wenn ich zum Beispiel viele Aufrufe an eine Datenbank habe, in der ich alle Spalten + Werte manuell festlege, wird das als gutes Design angesehen. Wenn ich jedoch die Struktur der Datenbank ändern will, werde ich werde alle Werte in meinem ändern (zum Beispiel PHP-Code) This = Effizienz Null oder nahe bei Null; Ist das ein gutes Design? (In der realen Welt sind die Gedanken nicht dynamisch dynamisch = dynamisch. Warum etwas behoben wird als ein gutes Design? – MTK

+0

Das Design ist immer noch in den Projektstatus ... dafür versuche ich verschiedene Szenarien – MTK

Antwort

0

Sie können sehr dynamische Abfragen in mysql erstellen.

Ein Beispiel für Ihre Frage - jetzt mit zusätzlichen SQL-Injection-Schutz!

DELIMITER ;; 

DROP PROCEDURE IF EXISTS insert_into_table_columns_values ;; 

CREATE DEFINER=`root`@`localhost` PROCEDURE insert_into_table_columns_values(IN tableName_ text, IN columns_ text, IN values_ text) 
BEGIN 

    DECLARE tableText text ; 
    DECLARE columnText text ; 
    DECLARE valuesText text ; 

    set @tableText = tableName_ ; 
    set @columnsText = columns_ ; 
    set @valuesText = values_ ; 

    SELECT LOCATE('select', @tableText) into @tableTextSelect ; 
    SELECT LOCATE('delete', @tableText) into @tableTextDelete ; 
    SELECT LOCATE('truncate', @tableText) into @tableTextTruncate ; 
    SELECT LOCATE('drop', @tableText) into @tableTextDrop ; 

    SELECT LOCATE('select', @columnsText) into @columnsTextSelect ; 
    SELECT LOCATE('delete', @columnsText) into @columnsTextDelete ; 
    SELECT LOCATE('truncate', @columnsText) into @columnsTextTruncate ; 
    SELECT LOCATE('drop', @columnsText) into @columnsTextTextDrop ; 

    SELECT LOCATE('select', @valuesText) into @valuesTextSelect ; 
    SELECT LOCATE('delete', @valuesText) into @valuesTextDelete ; 
    SELECT LOCATE('truncate', @valuesText) into @valuesTextTruncate ; 
    SELECT LOCATE('drop', @valuesText) into @valuesTextTextDrop ; 

    if @tableTextSelect 
     + @tableTextDelete 
     + @tableTextTruncate 
     + @tableTextDrop 

     + @columnsTextSelect 
     + @columnsTextDelete 
     + @columnsTextTruncate 
     + @columnsTextTextDrop 

     + @valuesTextSelect 
     + @valuesTextDelete 
     + @valuesTextTruncate 
     + @valuesTextTextDrop 

     = 0 then 

     set @insertSQL = concat('insert into ', @tableText, @columnsText , ' values ', @valuesText , ' ; ') ; 

     PREPARE insertStatement FROM @insertSQL; 
     EXECUTE insertStatement ; 
     DEALLOCATE PREPARE insertStatement; 

    else 

     select 'invalid parameter(s)' error 
     , @tableText table_ 
     , @columnsText columns_ 
     , @valuesText values_ 

     , @tableTextSelect 
     , @tableTextDelete 
     , @tableTextTruncate 
     , @tableTextDrop 

     , @columnsTextSelect 
     , @columnsTextDelete 
     , @columnsTextTruncate 
     , @columnsTextTextDrop 

     , @valuesTextSelect 
     , @valuesTextDelete 
     , @valuesTextTruncate 
     , @valuesTextTextDrop ; 

    end if ; 



END;; 
DELIMITER ; 

-- example 
call insert_into_table_columns_values('truncate employees', '(hire_date)', "('2017-06-12')") ; 

-- results as json 
{ 
    "data": 
    [ 
     { 
      "error": "invalid parameter(s)", 
      "table_": "truncate employees", 
      "columns_": "(hire_date)", 
      "values_": "('2017-06-12')", 
      "@tableTextSelect": 0, 
      "@tableTextDelete": 0, 
      "@tableTextTruncate": 1, 
      "@tableTextDrop": 0, 
      "@columnsTextSelect": 0, 
      "@columnsTextDelete": 0, 
      "@columnsTextTruncate": 0, 
      "@columnsTextTextDrop": 0, 
      "@valuesTextSelect": 0, 
      "@valuesTextDelete": 0, 
      "@valuesTextTruncate": 0, 
      "@valuesTextTextDrop": 0 
     } 
    ] 
} 

Getestet auf MySQL.

+0

Vielen Dank für die Antwort, aber die Injektion haben Riskieren Sie sich, wenn eine der Variablen = test 'ist, (wählen Sie das Passwort aus mysql.user wo Benutzer =' root 'Limit 0,1),' test2 ') - - – MTK

+0

oder ähnliches ... bis einer funktioniert! – MTK

+0

Haben Sie das versucht? Es scheint mir, die SQL-Anweisung würde fehlschlagen. –

Verwandte Themen