INSERT INTO mit Mysql/PHP Formulardaten in Datenbank schreiben

OK, das ist die komplette Formulardatei, aber der Witz an der Sache ist ja das das Formular auch dynamisch je nach tabelle generiert wird. Das soll folgendermaßen funktionieren:
Ich lese alle Spaltenüberschriften mit Datentyp aus. Anhand der Spaltenüberschriften habe ich dann die Anzahl der Felder und ihre jeweiligen Bezeichnungen. Durch den Datentyp weiß ich ob ich eine textarea oder ein normales textfeld brauche(weitere typen sollen, sobald es grundsätzlich funktioniert, noch folgen). Dann gibt er User was ein in die Felder und das ganze sollte dann mit den gesammelten Daten wieder rückwärts laufen was ja auch funktioniert...bis auf das INSERT INTO Statement.

Also die Funktion dataset($itraxx_data_obj, $itraxx_user_obj, $itraxx_forum_obj, $itraxx_messages_obj) wird über einen selbstgeschriebenen parser aufgerufen. Sie entscheidet ob das Formular verarbeitet werden soll oder ob es ausgegeben werden soll(dataset($itraxx_data_obj, $itraxx_user_obj, $itraxx_forum_obj, $itraxx_messages_obj)). Die Datenbankaktionen werden über ein Objekt geregelt($itraxx_data_obj).

PHP:
function dataset($itraxx_data_obj, $itraxx_user_obj, $itraxx_forum_obj, $itraxx_messages_obj)
{
if($_POST['sent']==1)
{
$keys=array_keys($_POST);
$values=array_values($_POST);

for($i=0;$i<=count($keys);$i++)
{
//trim($values[$i]);
if($insert_values!="")
{
$insert_values.=", ";
$insert_fields.=", ";
}


if(eregi("int_",$keys[$i]))
{
//$insert_values.=prepare_4db ($values[$i], strlen($values[$i]), $lf = false);
$insert_values.="'".$values[$i]."'";
$insert_fields.="'".$keys[$i]."'";

}
else if(eregi("text_",$keys[$i]))
{
//$insert_values.=prepare_4db ($values[$i], strlen($values[$i]), $lf = true);
$insert_values.="'".$values[$i]."'";
$insert_fields.="'".$keys[$i]."'";
}
else
{
$insert_fields=substr($insert_fields,0,strlen($insert_fields)-2);
$insert_values=substr($insert_values,0,strlen($insert_values)-2);
break;
}






}
$insert_fields=eregi_replace("int_","",$insert_fields);
$insert_fields=eregi_replace("text_","",$insert_fields);


//$insert_fields="`mainentry`, `subentry`, `footentry`, `index`, `html_content`, `php_content`, `explain`, `html_timestamp`, `php_timestamp`, `linkname`, `html_author`, `php_author`, `rights`, `showmenu`"; 
 
//$insert_values="'123', '23', '20', 'home.php', '', '', '', '0', '0', 'endlich', '1', '1' , '0', '0'"; 
 
 
$sql="INSERT INTO $_POST[tablename] ($insert_fields) VALUES ($insert_values)"; 
 


echo $sql;
$itraxx_data_obj->database_query($sql) //or die(mysql_error());
}
else
{

return dataset_form($itraxx_data_obj, $itraxx_user_obj, $itraxx_forum_obj, $itraxx_messages_obj);
}
}
function dataset_form($itraxx_data_obj, $itraxx_user_obj, $itraxx_forum_obj,$itraxx_messages_obj)
{
$table="contentdata";

$form_field=get_form_fields($itraxx_data_obj,$table);

$outstring="
<div class=\"inline-box-head\">datenbank-manager v.2.1</div>
<div class=\"inline-box-content\">
<form method=\"POST\" action=\"home.php?mn=2&sn=7&genc=left\">
<table width=\"100%\">
";
$i=0;
while($i<count($form_field))
{
print($i);
$outstring.="<tr>";
if( test_fielddatatype($form_field[$i]['type'])=="int")
{
$outstring.="<td>".$form_field[$i]['field']."</td><td><input type=\"text\" name=\"int_".$form_field[$i]['field']."\"  class=\"form-input\"  size=\"40\" maxlenght=\"70\" value=\"".$form_field[$i]['default']."\"></td>";

}
else if( test_fielddatatype($form_field[$i]['type'])=="text")
{
$outstring.="<td>".$form_field[$i]['field']."</td><td><textarea name=\"text_".$form_field[$i]['field']."\" rows=\"5\" cols=\"53\" value=\"".$form_field[$i]['default']."\" >";
$outstring.="</textarea>";

}
else if( test_fielddatatype($form_field[$i]['type'])=="varchar")
{
$outstring.="<td>".$form_field[$i]['field']."</td><td><input type=\"text\" name=\"text_".$form_field[$i]['field']."\"  class=\"form-input\"  size=\"40\" maxlenght=\"70\" value=\"".$form_field[$i]['default']."\"></td>";

}
$outstring.="</tr>";
$i++;
}
$outstring.="<tr><td colspan=\"2\">
<input type=\"submit\" name=\"button\" value=\"save\" class=\"button\">
<input type=\"reset\" name=\"button\" value=\"reset\" class=\"button\">
</td></tr></table>
<input type=\"hidden\" name=\"sent\" value=\"1\">
<input type=\"hidden\" name=\"tablename\" value=\"".$table."\">
</form>
</div>";

return $outstring;
}
function get_form_fields($itraxx_data_obj,$table)
{
$result=$itraxx_data_obj->database_query("SHOW COLUMNS FROM ".$table);

$form_field_tmp=$itraxx_data_obj->database_fetch_array($result);
$i=0;
while($form_field_tmp)
{
$form_field[$i]=array(
"field"=>$form_field_tmp[0],
"type"=>$form_field_tmp[1],
"attributes"=>$form_field_tmp[2],
"zero"=>$form_field_tmp[3],
"default"=>$form_field_tmp[4],
"extra"=>$form_field_tmp[5]
);
$form_field_tmp=$itraxx_data_obj->database_fetch_array($result);
$i++;
}

return $form_field;
}
function test_fielddatatype($string)
{
if(eregi("int",$string))
{
return "int";
}
else if(eregi("varchar",$string))
{
return "varchar";
}
else 
{
return "text";
}
}
 
Zuletzt bearbeitet:
Mhm, der Code ist ja nicht so komplitziert wie er scheint...
..allerdings ziemlich unübersichtlich.
Soweit ich das sehe scheint dieser auch völlig Korrekt zu sein.
Desshalb poste ich auch hier;

Ich hatte vor ca. 1nem Jahr genau das selbe Problem, allerdings scheint dies auch etwas mit den Systemen auf denen das Script ausgeführt wird zutun haben.
Denn bei mit Zuhause lief das Script ohne Probleme (damals Windows), als ich es jedoch af den (Linux)-Server portiert hab, traten genau diese Fehler auf;
INSERTs die bei mit funktioniert hatten, funktionierten auf einmal nichtmehr oder nur sporadisch. :confused:
Sporadisch darum: Die Funktion war anscheinend vom Browser, von der PHP+MySQL-Version und vom verwendeten (Apache)-Server abhängig.
Fazit: Ich habe die Lösung bzw. den Grund für dieses Phänomen nie entdeckt.

In meinem Fall hat sich das Problem von selbst erledigt, nachdem mein Server 2Tage nicht erreichbar war. Anscheinend hat der Hoster irgendetwas verändert.

Vielleicht helfen euch meine Beobachtungen ja ein Stück weiter, aber bei mir haben sie nur jede Menge neue Fragen hervorgerufen.

Ich arbeite momentan an meinem eigenen CMS und ich hoffe das ich damit nicht schonwieder derartige Probleme hab.

Viel Glück an alle Entwickler die sich an diesem Problem versuchen.
Greez da XEMO
 
Hallo Leute
Vielen, vielen Dank an alle die hier in diesem Thread mitgeschrieben/mitgeholfen haben. Mysql wird für mich immer ein Rätsel bleiben vor allem das "INSERT INTO" Statement....aber Rätsel kann man glücklicherweise lösen und nach fast 48h hab ich dann endlich die Lösung gefunden, kurz und knapp:
PHP:
$sql="INSERT INTO $_POST[tablename]  VALUES ($insert_values)";
Anscheinend braucht MYSQL die Feldnamen garnicht oder besser gesagt...Mysql will garkeine Feldnamen lässt man sie weg so funktioniert das Statement tadellos.

:-) (!)
 
Mhm - Coole Sache.
Stellt sich nur noch die Frage warum MySQL keine Keys verlangt.
Vielleicht weil du alle vorhandenen Keys mit Values füllst. :confused:

Werds mir auf jeden Falll merken ;)
 
Denk, grübel ich glaube ich sollte den Thread zur weiteren Diskussion warum Mysql keine Keys mag wieder öffnen. Aber warum sollt es die Keys nicht mögen weil ich allen Keys nen Value zuweise:
1. Ich Weise allen Keys nen' Value zu und zwar mit korrekter Syntax/Reihenfolge.
2.Wenn der User nicht's eingibt wird der Value mit einem 100% passenden Standardvalue aufgefüllt ob das jetzt ' ' ist oder '0' sollte doch eigentlich egal sein

Es könnte natürlich auch sein das die aktuelle Schreibweise nur eine Art verkürzte Schreibweise ist und die Syntax falsch ist mit denen die Keys eingetragen werden. D.h. Mysql ist so intelligent(Wenn der User nicht, dann wenigstens das Programm ;) ), dass es sich, wenn der User keine Felder eingibt selbst die Keysyntax generiert....aber entsteht da dann nicht irgendwo eine unsichtbare mögliche Fehlerquelle:confused:

Naja hier sind wohl Expertenmeinungen gefragt
 
Zurück