php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 8 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 25-06-2010, 22:26
gsc2010
 Registrierter Benutzer
Links : Onlinestatus : gsc2010 ist offline
Registriert seit: Jun 2010
Beiträge: 23
gsc2010 befindet sich auf einem aufstrebenden Ast
Unhappy [PHP] Benötige Hilfe bei einem Script [Newbie]

Hallo Boardies,
ich bin erst seit heute bei euch registriert, und habe mich durch verschiedene Tutorials gelesen.
Und komme dennoch keinen Meter mehr weiter.

Mein Vorhaben:
Teampage mit Bildupload in eine Datenbank mit späteren Auslesen.

Mein Problem:
Das Formular funktioniert soweit,
jedoch,es können keine Daten an die Datenbank geschickt werden,
Grund : ich denke, das ich einen Fehler drin habe. Nur weiss ich nicht mehr weiter.
PHP-Code:
<?php
###### Config-Datei
$db_host "localhost";  // Datenbank-Server
$db_user "root";       // Benutzer
$db_pass "";           // Passwort
$db_name "test";       // Datenbank-Name
/// Hier noch den Zielordner angeben
$zielorg "../teampage/uploads/";
/// Ab hier ist nichts mehr zu ändern!
if (isset( $_POST['eintragen'] ))
{
// Maskierende Slashes aus POST entfernen
$_POST get_magic_quotes_gpc() ? array_map'stripslashes'$_POST ) : $_POST;
// Inhalte der Felder aus POST holen
$bild $_FILES['bild'];
$name $_POST['name'];
$nickname $_POST['nickname'];
$alter = (int) $_POST['alter'];
$wohnort $_POST['wohnort'];
$msn $_POST['msn'];
$geschlecht $_POST['geschlecht'];
$teampage $_POST['teampage'];
$member = isset( $_POST['moderator'] ) ? 1;
##
##Check ob alles passt
##

// Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
// Verbindung oeffnen und Datenbank ausweahlen
$conID mysql_connect$db_host$db_user$db_pass )
or die( 
"Die Datenbank konnte nicht erreicht werden!" );
if (
$conID)
{
mysql_select_db$db_name$conID );
}
// Anfrage zusammenstellen der an die DB geschickt werden soll
$sql "INSERT INTO `test`
(`bild`,`name`, `nickname`, `alter`, `wohnort`, `msn`, `geschlecht`, `teampage`, `moderator`)
VALUES(
.$bild",
'" 
.mysql_real_escape_string$name ). "',
'" 
.mysql_real_escape_string$nickname ). "',
.$alter",
'" 
.mysql_real_escape_string$wohnort ). "',
'" 
.mysql_real_escape_string$msn ). "',
'" 
.mysql_real_escape_string$geschlecht ). "',
'" 
.mysql_real_escape_string$teampage ). "',
.$member"
)"
;
// Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle
mysql_query$sql );
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
if (mysql_affected_rows() == 1)
{
echo 
"<h3>Der Datensatz wurde hinzugefügt!</h3>";
// Hier kann weiterer Code stehen der ausgefuehrt werden soll
// wenn ein Eintrag erfolgreich war. z.B. Email an den Admin schicken
// der ueber den neuen Eintrag informiert
}
else
{
echo 
"<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
// Hier koennen Massnahmen ergriffen werden die ueber den Misserfolg informieren
// wie z.B. den Benutzer darueber zu informieren, dem Admin eine Mail schicken
// damit er sich um den Fehler kuemmern kann, etc pp
}
}
function 
uploader($fotofile$fotofile_name$fotofile_type)
{
if(
$fotofile_type != 'image/jpeg' && $fotofile_type != 'image/pjpeg')
{
return 
$upload_log 'Die Datei '.$fotofile_name.' ist nicht vom Typ Jpeg, sondern $fotofile_type!';
}
// Angabe Dateiendung
$datei_ende '.jpg';

// Foto speichern
$zielorg .= substr($fotofile_name,0,strrpos($fotofile_name,'.')).$datei_ende;
if(
file_exists($zielorg))
{
return 
$upload_log 'Die Datei '.$fotofile_name.' exsitiert schon auf dem Server!';
}
if(!
move_uploaded_file($fotofile$zielorg))
{
return 
$upload_log 'Ein Fehler beim Kopieren der Datei '.$fotofile_name.' ist aufgetreten!';
}

return 
$upload_log $zielorg;
}
?>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formularinhalt in eine Datenbank schreiben</title>
</head>

<body>
<?
echo
'<form name="formular" enctype="multipart/form-data" action="'.$_SERVER['PHP_SELF'].'?action=upload"
method="post" name="formular" id="formular">'
;
?>

<table border="1" bordercolor="#000" cellspacing="1" cellpadding="2" width="100%">
<tr>
<td width="34%" align="left" valign="top">Bild-Datei</td>
<td width="66%" align="right" valign="top">
<input name="bild" type="file" id="bild" size="28">
</td>
<tr>
<td width="34%" align="left" valign="top">Name:</td>
<td width="66%" align="right" valign="top">
<input type="text" name="name" id="name" size="50" maxlength="60" value="" />
</td>
<tr>
<td width="34%" align="left" valign="top">Nickname:</td>
<td width="66%" align="right" valign="top">
<input type="text" name="nickname" id="nickname" size="50" maxlength="60" value="" />
</td>
<tr>
<td width="34%" align="left" valign="top">Altersangabe:</td>
<td width="66%" align="right" valign="top"><select name="alter" id="alter">
<?php for ($i=16$i<60$i++) { echo "<option>{$i}</option>"; } ?></select>
</td>
<tr>
<td width="34%" align="left" valign="top">Wohnort :</td>
<td width="66%" align="right" valign="top">
<input type="text" name="wohnort" id="wohnort" size="50" maxlength="60" value="" />
</td>
<tr>
<td width="34%" align="left" valign="top">MSN-Nickname :</td>
<td width="66%" align="right" valign="top">
<input type="text" name="msn" id="msn" size="50" maxlength="60" value="" />
</td>
<tr>
<td width="34%" align="left" valign="top">Geschlechtsangabe:</td>
<td width="66%" align="right" valign="top">
<input type="radio" name="geschlecht" id="geschlecht_1" value="männlich" checked="checked" />
M&auml;nnchen
<input type="radio" name="geschlecht" id="geschlecht_2" value="weiblich" />
Weibchen</td>
<tr>
<td width="34%" align="left" valign="top">Link zur Nickpage :</td>
<td width="66%" align="right" valign="top">
<input type="text" name="teampage" id="teampage" size="50" maxlength="60" value="" />
</td>
<tr>
<td width="34%" align="left" valign="top">Moderator [ja / nein]</td>
<td width="66%" align="right" valign="top">
<b><u>J</u></b>a
<input type="checkbox" name="member" id="member" /></td>
<tr>
<td width="34%" align="left" valign="top">Eintragen | Eingaben zur&uuml;cksetzen</td>
<td width="66%" align="right" valign="top">
<input type="submit" name="eintragen" id="eintragen" value="Eintragen" />
&nbsp;&nbsp; <input type="reset" name="button" id="" value="Eingaben l&ouml;schen" />
</td>
<tr>
</table>
</form>
</body>
</html>
Das ist die SQL
PHP-Code:
-- Tabellenstruktur für Tabelle `test`
--

CREATE TABLE `test` (
  `
idint(11NOT NULL auto_increment,
  `
bildvarchar(255collate latin1_general_ci NOT NULL,
  `
namevarchar(255collate latin1_general_ci NOT NULL,
  `
nicknamevarchar(255collate latin1_general_ci NOT NULL,
  `
altertinyint(3unsigned NOT NULL,
  `
wohnortvarchar(255collate latin1_general_ci NOT NULL,
  `
msnvarchar(255collate latin1_general_ci NOT NULL,
  `
geschlechtvarchar(20collate latin1_general_ci NOT NULL,
  `
teampagevarchar(255collate latin1_general_ci NOT NULL,
  `
moderatortinyint(1) default NULL,
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=35 ;

--
-- 
Daten für Tabelle `test`
-- 
Das ist mein kompletter Quellcode, und ich würde mich freuen, wenn ihr mir helfen könntet.

Geändert von gsc2010 (25-06-2010 um 23:07 Uhr) Grund: Ich hiffe, das es nun hinhaut mit der zeichenlänge
Mit Zitat antworten
  #2 (permalink)  
Alt 25-06-2010, 22:30
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

1. Bitte Code umbrechen!
2. http://peterkropff.de/tutorials/php_...php_fehler.htm
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 25-06-2010, 22:33
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo und willkommen im Forum,

bitte zuerst die Forenregeln lesen und deinen Beitrag daran anpassen. Siehe auch den roten Link in meiner Signatur.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #4 (permalink)  
Alt 25-06-2010, 22:58
gsc2010
 Registrierter Benutzer
Links : Onlinestatus : gsc2010 ist offline
Registriert seit: Jun 2010
Beiträge: 23
gsc2010 befindet sich auf einem aufstrebenden Ast
Standard

ich hoffe, das das nun hinhaut, mit der zeichenlänge
Mit Zitat antworten
  #5 (permalink)  
Alt 25-06-2010, 23:02
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Mach mal ein var_dump($_FILES['bild']) gleich zu Beginn deines Scripts. Dann siehst du, dass das ein Array ist und es sollte dir klar sein, dass man ein solches Array nicht so in eine SQL-Query einbauen kann, wie du es machst.

Lies dazu auch mal im PHP-Manual das Kapitel file upload.
Mit Zitat antworten
  #6 (permalink)  
Alt 25-06-2010, 23:04
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Sieh mal mit print_r nach, was in $bild (bzw. in $_FILES['bild']) wirklich drin steht. Darum solltest du auch die Forenregeln lesen, weil da unter anderem drin steht, wie man Fehler in SQL-Abfragen erkennt und behandelt.

Edit: Ach Rik, du bist mir heute zu schnell.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #7 (permalink)  
Alt 25-06-2010, 23:09
gsc2010
 Registrierter Benutzer
Links : Onlinestatus : gsc2010 ist offline
Registriert seit: Jun 2010
Beiträge: 23
gsc2010 befindet sich auf einem aufstrebenden Ast
Standard

ich hoffe, das ich das heute noch hinbekomme...
Vllt könnt ihr mir einen kleinen Tipp geben:
das mit print_r
verstehe ich schon, dennoch würde mich interessieren:
a) ist mein script, so wie es da steht, über haupt läuffähig ?
b) ist es nur ein Flüchtiger Fehler, den ich eingebaut habe, oder ein schwerer ?

Danke der Antworten
Zitat:
INSERT INTO `test`
(`bild`,`name`, `nickname`, `alter`, `wohnort`, `msn`, `geschlecht`, `teampage`, `moderator`)
VALUES( Array, '', '', 16, '', '', 'männlich', '', 1 )
Da sollte der Pfad stehen, zum Ordner....
Entweder habe ich jetzt einen kompletten Error im Kopf, oder ich weiss nimmer

Geändert von gsc2010 (25-06-2010 um 23:17 Uhr) Grund: ergebnis laut print_r
Mit Zitat antworten
  #8 (permalink)  
Alt 25-06-2010, 23:20
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von gsc2010 Beitrag anzeigen
...
Grund : ich denke, das ich einen Fehler drin habe. Nur weiss ich nicht mehr weiter.
ich mach mal die Änderungen direkt in deinem Code ..
PHP-Code:
<?php
...
// Es wundert mich ein wenig, dass du ohne Passwort auf deine DB zugreifst
// ...ich hoff mal es ist kein Produktiv-System, sondern steht bei dir im Zimmer ohne Internet-Verbindung
        // Anfrage zusammenstellen der an die DB geschickt werden soll
        // Nach meiner Erfahrung ist es besser solche langes INSERT anders aufzubauen....
        
$sql "INSERT INTO test SET "// ID ist autowert
        
$sql.=" bild='{$bild}', ";
        
$sql.=" name='{mysql_real_escape_string( $name )}', ";
        
$sql.=" nickname='{mysql_real_escape_string( $nickname )}', ";
        
$sql.=" alter='{$alter}', "// sieht merkwürdig aus, klappt aber
        
$sql.=" wohnort='{mysql_real_escape_string( $wohnort )}', ";
        
$sql.=" msn='{mysql_real_escape_string( $msn )}', ";
        
$sql.=" geschlecht='{mysql_real_escape_string( $geschlecht )}', ";
        
$sql.=" teampage='{mysql_real_escape_string( $teampage )}', ";
        
$sql.=" moderator='{$member}' ";
    
        echo 
$sql."<br>"// der berühmte Echo-Debugger ^^
        // Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle
        
$erfolg=mysql_query$sql );
        
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
        
if ($erfolg===TRUE//besser als affectedRows  
        
{
                echo 
"<h3>Der Datensatz wurde hinzugefügt!</h3>";
                ...
        }
        else
        {
                echo 
"<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
                ...
        }
    }
...
das mit INSERT INTO x SET erleichtert dir das Einfügen von Daten in große Tabellen erheblich, weil mal leicht durcheinander kommt mit der richtigen Reihenfolge der Datenspalten die INSERT INTO x () VALUES () erfordert .. und die Schreibweise mit Backticks erzeugt bei mir ne Gänsehaut unter den Fußsohlen ^^

Den Echo-Debugger darfst du selbstverständlich auskommentieren / löschen, sobald dein Script fehlerfrei macht, was du willst ...
__________________

Wer LESEN kann, ist klar im Vorteil!

Geändert von eagle275 (25-06-2010 um 23:25 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 25-06-2010, 23:25
gsc2010
 Registrierter Benutzer
Links : Onlinestatus : gsc2010 ist offline
Registriert seit: Jun 2010
Beiträge: 23
gsc2010 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
// Es wundert mich ein wenig, dass du ohne Passwort auf deine DB zugreifst
// ...ich hoffmal es ist kein Produktiv-System, sondern steht bei dir im Zimmer ohne Internet-Verbindung
Test-System ohne Zugriff von Ausserhalb ...
Deswegen ohne PW ....

Ich werde mal deinen Lösungsvorschlag ausprobieren...
Melde mich gleich wieder...
Danke
Mit Zitat antworten
  #10 (permalink)  
Alt 25-06-2010, 23:30
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

eehhhmm.. das mit $bild solltest du tatsächlich anpassen ..

du willst ja nur einen der Einträge aus dem Array (vermutlich) .. also

$bild=$_FILES('bild'][$index]; // welches ?
__________________

Wer LESEN kann, ist klar im Vorteil!
Mit Zitat antworten
  #11 (permalink)  
Alt 25-06-2010, 23:33
gsc2010
 Registrierter Benutzer
Links : Onlinestatus : gsc2010 ist offline
Registriert seit: Jun 2010
Beiträge: 23
gsc2010 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
du willst ja nur einen der Einträge aus dem Array (vermutlich) .. also

$bild=$_FILES('bilder'][$index]; // welches ?
Kann ich ja eigentlich die Variable
Zitat:
$zielorg = "../teampage/uploads/";
eintragen,
und es soll nur der Verzeichnispfad in die SQL eingetragen werden und dann soll später das Script dieses komplett auslesen, aber im 2.ten Script...
Ich denke, das ich nun auf dem richtigen Wege bin,
man sieht ja manchmal den Wald vor lauter Bäumen nimmer ....
Mit Zitat antworten
  #12 (permalink)  
Alt 25-06-2010, 23:47
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Wie onemorenerd schon sagte: PHP: Dateiuploads mit POST - Manual

Das solltest… nein das musst du lesen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #13 (permalink)  
Alt 25-06-2010, 23:52
gsc2010
 Registrierter Benutzer
Links : Onlinestatus : gsc2010 ist offline
Registriert seit: Jun 2010
Beiträge: 23
gsc2010 befindet sich auf einem aufstrebenden Ast
Standard

ok... Werde ich tun,
falls ich aber nicht weiter komme,
würdet ihr dann so nett sein, und mir helfen ... ??

Danke
Mit Zitat antworten
  #14 (permalink)  
Alt 26-06-2010, 00:03
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Klar, warum denn nicht? Wird aber im Idealfall nicht mehr nötig sein
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #15 (permalink)  
Alt 26-06-2010, 00:09
gsc2010
 Registrierter Benutzer
Links : Onlinestatus : gsc2010 ist offline
Registriert seit: Jun 2010
Beiträge: 23
gsc2010 befindet sich auf einem aufstrebenden Ast
Standard

ich werde mich morgen noch mal melden, habe das mit den Array´s zwar nun , dennnoch feuert das script mir immer noch fehler raus ....
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Benötige kurze Hilfe mit Script martydou Projekthilfe 2 16-08-2006 12:19
Hilfe bei einem PHP Script! 2003 Projekthilfe 8 04-08-2004 16:45
Brauche Hilfe bei einem CGI-Script Gironymus ASP, PERL, CGI, C und alles andere 4 10-03-2003 23:14
Bin immer noch php Newbie und komme mit einem Script nicht klar Annette PHP Developer Forum 3 12-06-2002 14:41
brauche Hilfe mit einem PHP-script quant PHP Developer Forum 4 25-10-2001 16:36

Themen-Optionen
Thema bewerten
Thema bewerten:

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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:45 Uhr.