CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
31.01.2007, 15:48:30
|
Anfänger
|
|
Registriert seit: Jan 2007
Ort: Meilen ZH
Alter: 49
Beiträge: 9
|
|
Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
Grundlagen: php, html, mysql DB (phpmyadmin)
Hallo zusammen. Mein erster Forumeintrag - nach Tagen des probierens und studierens. Hoffe, Ihr bietet mir Hilfe, denke aber schon.
Ich bin für unsere Firma an einem kleinen Intranet ausarbeiten. Eine Site, um Dokumente zu verwalten, anzuzeigen und zu suchen. Jetzt habe ich ein "Erfassungsformular" erstellt, und schreibe die Einträge (als text) und filepfade (ebenfalls text) aus dem Formular in meine DB. Das klappt soweit gut.
Nun will ich aber die files in einen bestimmten Ordner uploaden und den Zielpfad in die DB schreiben. Bis anhin schreibt er nur den Pfad vom Client (lokaler Pfad innerhalb Netzwerk, zBsp. W:/...) in die DB. Was kann ich tun. Habe schon etliches mit move_uploaded_file und copy... etc. getestet und es einfach nicht einbauen können.
Wie kann ich meinen (mit Dreamweaver erstellten) Code um meinen Wunsch ergänzen?
Hier ist das gesamte script mit formular:
PHP-Code:
<?php require_once('../Connections/intradb.php'); ?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $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 dokument (hauptthema, unterthema, code, linktext, pfad, beschreibung, keywords, vlink, datum) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, now())",
GetSQLValueString($_POST['hauptthema'], "text"),
GetSQLValueString($_POST['unterthema'], "text"),
GetSQLValueString($_POST['code'], "text"),
GetSQLValueString($_POST['linktext'], "text"),
GetSQLValueString($_POST['pfad'], "text"),
GetSQLValueString($_POST['beschreibung'], "text"),
GetSQLValueString($_POST['keywords'], "text"),
GetSQLValueString($_POST['vlink'], "text"),
GetSQLValueString($_POST['datum'], "date"));
mysql_select_db($database_intradb, $intradb);
$Result1 = mysql_query($insertSQL, $intradb) or die(mysql_error());
$insertGoTo = "erfassung.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
mysql_select_db($database_intradb, $intradb);
$query_unterthema = "SELECT bezeichnung FROM unterthema WHERE hauptthema = 'Amtliche Vermessung'";
$unterthema = mysql_query($query_unterthema, $intradb) or die(mysql_error());
$row_unterthema = mysql_fetch_assoc($unterthema);
$totalRows_unterthema = mysql_num_rows($unterthema);
mysql_select_db($database_intradb, $intradb);
$query_hauptthema = "SELECT bezeichnung FROM hauptthema";
$hauptthema = mysql_query($query_hauptthema, $intradb) or die(mysql_error());
$row_hauptthema = mysql_fetch_assoc($hauptthema);
$totalRows_hauptthema = mysql_num_rows($hauptthema);
mysql_select_db($database_intradb, $intradb);
$query_liste = "SELECT id_dok, hauptthema, unterthema, code, linktext, pfad, beschreibung, datum FROM dokument ORDER BY id_dok DESC";
$liste = mysql_query($query_liste, $intradb) or die(mysql_error());
$row_liste = mysql_fetch_assoc($liste);
$totalRows_liste = mysql_num_rows($liste);
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Unbenanntes Dokument</title>
<link href="../css/styles.css" rel="stylesheet" type="text/css">
</head>
<body onLoad="MM_preloadImages('../img/new_unterthema_hover.gif')">
form method="post" name="form1" action="<?php echo $editFormAction; ?>">
<table width="70%" align="center">
<tr valign="baseline">
<td align="right" nowrap bgcolor="#CCFFCC" class="listentitel">Unterthema:</td>
<td width="62%" bgcolor="#CCFFCC"><select name="unterthema">
<?php
do {
?>
<option value="<?php echo $row_unterthema['bezeichnung']?>"><?php echo $row_unterthema['bezeichnung']?></option>
<?php
} while ($row_unterthema = mysql_fetch_assoc($unterthema));
$rows = mysql_num_rows($unterthema);
if($rows > 0) {
mysql_data_seek($unterthema, 0);
$row_unterthema = mysql_fetch_assoc($unterthema);
}
?>
</select>
<span class="microtext">(Gruppierung) </span></td>
<td width="21%" align="right" valign="middle" bgcolor="#CCFFCC"><span class="listentitel">HINZUFÜGEN</span> <a href="admin.php"><img src="../img/new_unterthema.gif" alt="Neues Unterthema erfassen..." name="Image1" width="26" height="31" border="1" id="Image1" onMouseOver="MM_swapImage('Image1','','../img/new_unterthema_hover.gif',1)" onMouseOut="MM_swapImgRestore()"></a></td>
</tr>
<tr valign="baseline">
<td align="right" nowrap bgcolor="#CCFFCC" class="listentitel">Code:</td>
<td colspan="2" bgcolor="#CCFFCC"><select name="code">
<option value="WE" >WE (Weisung)</option>
<option value="IF" >IF (Information)</option>
<option value="PB" >PB (Prozessbeschrieb)</option>
<option value="HA" selected >HA (Handbuch)</option>
<option value="AW" >AW (Arbeitsanweisung)</option>
<option value="VO" >VO (Vorlagen)</option>
</select> </td>
</tr>
<tr valign="baseline">
<td align="right" nowrap bgcolor="#CCFFCC" class="listentitel">Dokumenttitel:</td>
<td colspan="2" bgcolor="#CCFFCC"><input type="text" name="linktext" value="" size="32"></td>
</tr>
<tr valign="baseline">
<td align="right" nowrap bgcolor="#CCFFCC" class="listentitel">Datei:</td>
<td colspan="2" bgcolor="#CCFFCC"><input type="file" name="pfad" value="" size="32"></td>
</tr>
<tr valign="baseline">
<td align="right" valign="top" nowrap bgcolor="#CCFFCC" class="listentitel">Beschreibung:</td>
<td colspan="2" bgcolor="#CCFFCC"><textarea name="beschreibung" cols="50" rows="5"></textarea> </td>
</tr>
<tr valign="baseline">
<td align="right" nowrap bgcolor="#CCFFCC" class="listentitel">Keywords:</td>
<td colspan="2" bgcolor="#CCFFCC"><input type="text" name="keywords" value="" size="32"></td>
</tr>
<tr valign="baseline">
<td align="right" nowrap bgcolor="#CCFFCC" class="listentitel">Vlink:</td>
<td colspan="2" bgcolor="#CCFFCC"><input type="file" name="vlink" value="" size="32">
<span class="microtext">(zusammenhängendes Dokument)</span> </td>
</tr>
<tr valign="baseline">
<td align="right" nowrap bgcolor="#CCFFCC" class="listentitel"> </td>
<td colspan="2" bgcolor="#CCFFCC"><input name="submit" type="submit" value="Datensatz einfügen"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right"> </td>
<td colspan="2"> </td>
</tr>
<tr valign="baseline">
<td colspan="3" align="right" nowrap> </td>
</tr>
</table>
<input type="hidden" name="hauptthema" value="Amtliche Vermessung">
<input type="hidden" name="datum" value="now()">
<input type="hidden" name="MM_insert" value="form1">
</form</body>
</html>
<?php
mysql_free_result($unterthema);
mysql_free_result($hauptthema);
mysql_free_result($liste);
?>
Geändert von stefan_s (02.02.2007 um 21:26:29 Uhr)
|
31.01.2007, 18:02:35
|
Anfänger
|
|
Registriert seit: Jan 2007
Ort: Meilen ZH
Alter: 49
Beiträge: 9
|
|
AW: Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
Frustrierend! Noch keine Antwort. Habe ich zu viel auf einmal gepostet? Dachte es wäre einfacher, wenn ihr gleich alles sehen könnt.
Bin jetzt daran, es anderst zu lösen. Das uploaden in ein von mir gewünschtes Verzeichnis geht auch. Das schreiben in die DB auch. Aber alles in einem Schritt mit Knopfdruck auf den "Submit-Button" - da liegt der Hund begraben.
Na ja - ich warte mal noch ab...;-)
|
31.01.2007, 22:10:21
|
Member
|
|
Registriert seit: Jun 2006
Ort: Bayern
Alter: 56
Beiträge: 930
|
|
AW: Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
Um ein Datei-Upload realisieren zu können musst du in deinem einleitenden Form-Tag erstmal eine öffnende spitze Klammer setzen und das Attribut enctype="multipart/form-data" einfügen. Mehr hab ich mir erstmal nicht angeschaut, da es da schon scheitert. Auf der Seite hier im Praxisbuch oder Kochbuch findest du Erklärungen zu Datei-Upload.
vlink wird dann mit $_FILES und nicht mit $_POST ausgelesen.
__________________
Grüße Andes
Geändert von Andes (31.01.2007 um 22:12:26 Uhr)
|
31.01.2007, 23:27:31
|
Anfänger
|
|
Registriert seit: Jan 2007
Ort: Meilen ZH
Alter: 49
Beiträge: 9
|
|
AW: Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
Ciao Andes. Merci für deine Antwort. Stimmt, der öffnende form-tag fehlt. Ist aber nur beim kopieren des Codes nicht mitgekommen.
Das vorliegende Script funktioniert auch tip top. Bloss, mein Problem ist, dass die zwei files vom Formular nicht geuploadet werden, sondern einfach nur der Pfad vom Ort der Datei in die Db geschrieben wird. Ich will aber die Datei zuerst in ein bestimmtes Verzeichnis uploaden, und dann erst den Pfad in die Db schreiben. Und das in einem Schritt. Überall finde ich Möglichkeiten mit zwei Schritten. Dann muss ich erst die Datei uploaden und dann nochmals anwählen um der definitive Pfad in die DB zu schreiben...
|
31.01.2007, 23:39:36
|
Member
|
|
Registriert seit: Jun 2006
Ort: Bayern
Alter: 56
Beiträge: 930
|
|
AW: Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
Wie schon geschrieben musst du enctype="multipart/form-data" einfügen und nach dem Formularsenden kannst du per $_FILES['vlink'] auf die Datei zugreifen. $_FILES['vlink'] ist ein Array. Die anderen Daten ließt du wie gewohnt mit $_POST aus.
Um das in einen Abwasch zu erledigen brauchst du nur folgendes zu machen.
PHP-Code:
//Datei-Prüfungen vorher ausführen
if(move_uploaded_file($_FILES['vlink']['tmp_name'], 'verzeichnis/dateiname')) {
//Pfad in DB eintragen
}
else {
//kein Upload, erneut versuchen
}
__________________
Grüße Andes
Geändert von Andes (31.01.2007 um 23:40:07 Uhr)
|
01.02.2007, 00:05:37
|
Anfänger
|
|
Registriert seit: Jan 2007
Ort: Meilen ZH
Alter: 49
Beiträge: 9
|
|
AW: Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
Danke. Werde mich nochmals daran versuchen. Obwohl ich langsam keine nerven mehr habe. Übrigens das mit $_FILES resp. typ "file" oder "text" habe ich im Script mal geändert. Und auch in der DB ist der Datentyp "text", weil ich ja nicht will, dass die Datei sondern nur der Pfad in die DB geschriebn wird. Folgende Zeilen habe ich hierfür geändert:
Jetzt:
PHP-Code:
GetSQLValueString($_POST['hauptthema'], "text"),
GetSQLValueString($_POST['unterthema'], "text"),
GetSQLValueString($_POST['code'], "text"),
GetSQLValueString($_POST['linktext'], "text"),
GetSQLValueString($_POST['pfad'], "text"),
GetSQLValueString($_POST['beschreibung'], "text"),
GetSQLValueString($_POST['keywords'], "text"),
GetSQLValueString($_POST['vlink'], "text"),
GetSQLValueString($_POST['datum'], "date"));
Vorher:
PHP-Code:
GetSQLValueString($_POST['hauptthema'], "text"),
GetSQLValueString($_POST['unterthema'], "text"),
GetSQLValueString($_POST['code'], "text"),
GetSQLValueString($_POST['linktext'], "text"),
GetSQLValueString($_POST['pfad'], "file"),
GetSQLValueString($_POST['beschreibung'], "text"),
GetSQLValueString($_POST['keywords'], "text"),
GetSQLValueString($_POST['vlink'], "file"),
GetSQLValueString($_POST['datum'], "date"));
Ob ich bei diesen auch noch aus $_FILES $_POST gemacht habe, bin ich mir nicht mehr sicher.
Ich gehe nun mal deinem Input nach. Merci...
...und wo genau soll ich deîne Zeilen reinschreiben? Direkt nach dem formular, oder oben im php-script.
Dann nimmt mich noch wunder, was ich bei 'verzeichnis/dateiname' machen soll. Den 'dateiname' kann ich ja nicht vorgeben. Dieser ist ja immer ein anderer. Muss ich den Dateinamen auch in eine Variabel packen? Wenn ja, wie?
Na ja, bald ist "Bettchen" Zeit. Zeit mich ans Kissen zu kuscheln. Auf jeden Fall besten Dank für deine Hilfe. Bin um wirkliche jeden Input froh. Melde mich bestimmt wieder :----(
Geändert von stefan_s (01.02.2007 um 00:30:46 Uhr)
|
01.02.2007, 10:17:01
|
Member
|
|
Registriert seit: Jun 2006
Ort: Bayern
Alter: 56
Beiträge: 930
|
|
AW: Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
$_FILES['vlink'] kannst du mit GetSQLValueString()? nicht prüfen, da dies ein Array ist.
Wenn du nach dem Senden des Formulars mal var_dump($_FILES['vlink']) ausführst, kannst du die Elemente des Arrays sehen und siehst was alles übergeben wird.
Den Datei-Namen erhälst du über $_FILES['vlink']['name'] und $_FILES['vlink']['tmp_name'] liefert den temporären Datei-Namen unter dem PHP die Datei im Temp-Ordner gespeichert hat.
Das move_uploaded_file() muss in dein PHP-Script und bei 'verzeichnis/dateiname' musst du angeben in welchem Verzeichnis und unter welchem Dateinamen sie gespeichert werden soll. Den Datei-Namen erhältst du über $_FILES['vlink']['name'].
Im Praxisbuch unter Dateiupload via HTML-Formular findest du Erläuterungen und Scripte wie ein Dateiupload realisierbar ist.
__________________
Grüße Andes
|
02.02.2007, 21:21:35
|
Anfänger
|
|
Registriert seit: Jan 2007
Ort: Meilen ZH
Alter: 49
Beiträge: 9
|
|
Lösung gefunden! für: Dateiupload mit Formular und Zielpfad in DB schreiben
Ich habe also nach langem basteln und Bücherlesen mir nun doch noch ne Lösung erarbeitet.
Für alle die's Interessiert:
PHP-Code:
<?php
// Variabeln festlegen
$dpfad1 = ("uploads/".$_POST["hauptthema"]."/");
$max_byte_size = 8388608;
$allowed_types = "(jpg|jpeg|gif|bmp|png|pdf|doc|ppt)";
// Falls Formular abgeschickt...
if($_POST["submit"] == "Datensatz erfassen")
{
// ...und die Datei auch wircklich hochgeladen wurde...
if(is_uploaded_file($_FILES["file"]["tmp_name"]))
{
// angegebene Dateiendungen prüfen...
if(preg_match("/\." . $allowed_types . "$/i", $_FILES["file"]["name"]))
{
// und schauen, ob Datei nicht zu gross ist
if($_FILES["file"]["size"] <= $max_byte_size)
{
// AWenn I.O. Datei in den gewünschten pfad kopieren
if (move_uploaded_file($_FILES['file']['tmp_name'],$dpfad1.$_FILES['file']['name']))
{
// Nun Vorbereitung, für Eintragung in DB
$pfad = ("$dpfad1".$_FILES["file"]["name"]);
$connection = mysql_connect($sql['host'],$sql['uid'],$sql['pwd']);
if($connection)
{
if(mysql_select_db($sql['db']))
{
$hauptthema = $_POST['hauptthema'];
$unterthema = $_POST['unterthema'];
$code = $_POST['code'];
$linktext = $_POST['linktext'];
$file = $_FILES['file'];
$beschreibung = $_POST['beschreibung'];
$keywords = $_POST['keywords'];
$vlink = $_FILES['vlink'];
$datum = $_POST['datum'];
$setzen = "INSERT INTO dokument (hauptthema, unterthema, code, linktext, pfad, beschreibung, keywords, vlink, datum) VALUES ('".$hauptthema."', '".$unterthema."', '".$code."', '".$linktext."', '".$pfad."', '".$beschreibung."', '".$keywords."', '".$vlink."', now() )";
$ergebnis=mysql_query($setzen);
$insertGoTo = "erfassung/erfassung.php";
if (isset($_SERVER['QUERY_STRING']))
{
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
else
{
echo '<p>Datenbank konnte nicht ausgewählt werden!</p>';
}
}
else
{
echo '<p>Verbindung konnte nicht hergestellt werden!</p>';
}
}
else
{
echo "Datei konnte nicht hochgeladen werden.";
}
}
else
{
echo "Die Datei darf nur eine Größe von " . $max_byte_size . " Byte besitzen.";
}
}
else
{
echo "Die Datei besitzt keine ungültige Endung.";
}
}
else
{
echo "Keine Datei zum Hochladen angegeben.";
}
}
else
{
echo "Bitte benutzen Sie das Upload Formular.";
}
?>
Nun ist noch eine Frage für mich offen. Im oben geposteten Formular (wurde auch übrigens dort minime änderung durchgeführt) hat es zwei Dateifelder. Wie kann ich meinen Code so ändern, dass ich beide files uploade und beide mit ihren Namen in die DB schreibe?
Es grüsst Euch - Stefan
Geändert von stefan_s (02.02.2007 um 21:24:55 Uhr)
|
02.02.2007, 23:11:14
|
Member
|
|
Registriert seit: Jun 2006
Ort: Bayern
Alter: 56
Beiträge: 930
|
|
AW: Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
In dem du erst beide Dateien hoch lädst und anschließend sie in deine DB einträgst.
Ist ein ganz schönes geklammer geworden. Mit ifelse würde es übersichtlicher sein.
Es ist keine gute Idee den Datei-Type an der Dateiendung zu ermitteln. So kann man dir leicht andere Formate unterschieben. $_FILES übergibt übrigens auch den Datei-Type ($_FILES['vlink']['type']). Aber auch dies ist nicht wirklich sicher. Besser wäre, wenn du den Mime-Type prüfst. mime_content_type()
Es ist auch keine gute Idee $_POST oder $_GET ungeprüft zu übernehmen. So kann man dir sql_injections unterjubeln und im schlimmsten Fall deine DB löschen. Prüfe die Variablen ob sie auch das enthalten was du erwartest und verwende mysql_real_escape_string().
__________________
Grüße Andes
Geändert von Andes (04.02.2007 um 18:56:09 Uhr)
|
04.02.2007, 17:26:57
|
Anfänger
|
|
Registriert seit: Jan 2007
Ort: Meilen ZH
Alter: 49
Beiträge: 9
|
|
AW: Troubles: Dateiupload mit Formular und Zielpfad in DB schreiben
Salü Andes
Danke für deine Tips. Erst mal bin ich froh, das mal so hingekriegt zu haben. Aber deine Vorschläge liegen an der Hand. Verwendet wird das ganze ja bei uns im Intranet. Also muss ich von sql_injections weniger Angst haben.
Aber ich werde mir mal noch die Zeit nehmen, und das Script übersichtlicher (ifelse) und nach deinen Tips zu gestalten. Da mir die Sicherheit für meine zukünftigen Arbeiten doch noch wichtig sind. Also besser jetzt schon damit anfangen.
Danke- und einen guten Start in die neue Woche...
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 23:30:42 Uhr.
|