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.
Diese Art von Problem ist symptomatisch für schlechtes Design – Strawberry
@ 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
Das Design ist immer noch in den Projektstatus ... dafür versuche ich verschiedene Szenarien – MTK