NULL-Felder
claudia
- datenbank
Hallo zusammen
1. Meine Tabelle habe ich wie folgt definiert:
CREATE TABLE stammbaum
(
id
varchar(30) NOT NULL default '',
name
varchar(50) default '',
vater
varchar(40) default '',
mutter
varchar(40) default '',
....
status
char(1) default NULL,
PRIMARY KEY (id
)
) TYPE=MyISAM;
2. Nun möchte ich einen neuen Datensatz wie folgt einfügen:
<?php
if (!function_exists("GetSQLValueString"))
{
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf("INSERT INTO stammbaum (id, name, vater, mutter, ..... , status) VALUES (%s, %s, %s, %s, ...., %s)",
GetSQLValueString($_POST['los'], "text"),
GetSQLValueString($_POST['name'], "text"),
GetSQLValueString($_POST['vater'], "text"),
GetSQLValueString($_POST['mutter'], "text"),
....
GetSQLValueString($_POST['status'], "text"));
mysql_select_db($database_reader, $reader);
$Result1 = mysql_query($insertSQL, $reader) or die(mysql_error());
}
3. Bei der Tabellenstruktur habe ich name, vater, mutter usw extra als Default-Wert '' gewählt.
Aber: Warum wird dort NULL hineingeschrieben??? Ich brauche in diesen Feldern einen leeren Wert, wenn ich beim Eingabeformular nichts angebe. Wer kann mir weiterhelfen?
Beim Einfügen eines Datensatzes mit phpmyadmin funktioniert es einwandfrei.
Für alle Anregungen bin ich dankbar.
hi,
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
Warum überschreibst du hier eigentlich die zuvor explizit für die MySQL-Schnittstelle aufbereiteten Werte wieder mit unsicheren?
- Bei der Tabellenstruktur habe ich name, vater, mutter usw extra als Default-Wert '' gewählt.
Aber: Warum wird dort NULL hineingeschrieben???
Weil die Unsinnsfunktion GetSQLValueString explizit "NULL" in die Werte setzt, wenn sie leer sind.
Ich brauche in diesen Feldern einen leeren Wert, wenn ich beim Eingabeformular nichts angebe.
Und warum übergibst du dann nicht einfach einen leeren Wert an die Datenbank, wenn du ihn schon vom Formular bekommst?
gruß,
wahsaga
Warum überschreibst du hier eigentlich die zuvor explizit für die MySQL-Schnittstelle aufbereiteten Werte wieder mit unsicheren?
Dreamweaver erstellt mir diese komlizierte Prozedure (und ich habe sie bisher noch nie hinterfragt).
Heisst das, dass ich einfach nur folgende Änderung anbringen muss?
$insertSQL = sprintf("INSERT INTO stammbaum (id, name, vater, mutter, ..... , status) VALUES (%s, %s, %s, %s, ...., %s)",
($_POST['los'],
$_POST['name'],
$_POST['vater'],
$_POST['mutter'],
....
$_POST['status']);
und es funktioniert mit den leeren werten?
hi,
Dreamweaver erstellt mir diese komlizierte Prozedure (und ich habe sie bisher noch nie hinterfragt).
Warum nicht?
Heisst das, dass ich einfach nur folgende Änderung anbringen muss?
$insertSQL = sprintf("INSERT INTO stammbaum (id, name, vater, mutter, ..... , status) VALUES (%s, %s, %s, %s, ...., %s)",
($_POST['los'],
$_POST['name'],
$_POST['vater'],
$_POST['mutter'],
....
$_POST['status']);und es funktioniert mit den leeren werten?
Nein, das ist auch noch Unfug, weil dort Zeichenketten nicht so aufbereitet werden, dass sie für die MySQL-Schnittstelle als Zeichenketten erkennbar wären.
Informiere dich über das Stichwort SQL Injection.
mysql_real_escape_string hat durchaus seine Berechtigung - nur in der unsinnigen Weise, wie Dreamweaver sie einsetzt, nicht.
Warum benutzt du eigentlich einen HTML-Editor zum erstellen von PHP-Scripten?
gruß,
wahsaga
Warum nicht?
werde ich wohl in Zukunft machen.
Informiere dich über das Stichwort SQL Injection.
mysql_real_escape_string hat durchaus seine Berechtigung - nur in der unsinnigen Weise, wie Dreamweaver sie einsetzt, nicht.
werde ich nachlesen
Warum benutzt du eigentlich einen HTML-Editor zum erstellen von PHP-Scripten?
kannst du mir einen Tip geben, welchen ich nehmen soll?
mfG
Aber: Warum wird dort NULL hineingeschrieben???
Diese Frage ist schon von wahsaga beantwortet, eine Anmerkung noch: Warum stellst Du nicht den Default-Wert NULL ein statt '' und befüllst nur die Felder per INSERT für die Du auch Werte hast? Dann wird nämlich der Default-Wert geschrieben, genau das was Du wünscht (bzw. wünschen solltest ;)?!
Diese Frage ist schon von wahsaga beantwortet, eine Anmerkung noch: Warum stellst Du nicht den Default-Wert NULL ein statt '' und befüllst nur die Felder per INSERT für die Du auch Werte hast? Dann wird nämlich der Default-Wert geschrieben, genau das was Du wünscht (bzw. wünschen solltest ;)?!
Da ich beim Aufruf des Forulares noch nicht weiss, welche der etwa 40 Felder der Anwender ausfüllt.
hi,
Da ich beim Aufruf des Forulares noch nicht weiss, welche der etwa 40 Felder der Anwender ausfüllt.
Beim Aufruf nicht, aber nach dem Abschicken.
gruß,
wahsaga