webForumDet fria alternativet

Varning i mailformulär

21 svar · 533 visningar · startad av silfver

silfverMedlem sedan apr. 200312 679 inlägg
#1

Hejsan!

Använder hoglinds mailscript, men jag har försökt modifiera det lite själv. Lyckas ju inte så bra - oväntat... :p

<?php
$mottagare = array(
    '1' => array('namn', 'mail'),
    '2' => array('namn', 'mail'),
    '3' => array('namn', 'mail'),
    '4' => array('namn', 'mail'),
    '5' => array('namn', 'mail')
)
//för de olika personer man ska kunna välja att skicka till.
?>

<?php
$din_site="weoo";
?>

<div id="kontakta">
	<form action="" method="post">
	
		<select id="to" name="to" tabindex="1">
		<?php
		foreach ($mottagare as $key => $val) {
		echo "<option value=\"$key\">$val[0]</option>\n";
		//i den här selecten väljs personen man vill skicka till
		}
		?>
		</select>

		<fieldset>
	
		<h3>namn:</h3>
		<input type="text" name="name" size="40" />
	
		<h3>ämne:</h3>
		<input type="text" name="subject" />
	
		<h3>e-post:</h3>
		<input type="text" name="email" size="40" />
		
		<h3>Telefonnummer</h3>
		<input type="text" name="telefon" />
	
		<h3>skriv ditt meddelande här:</h3>
		<textarea name="message" rows="9" cols="55"></textarea><br />
		
		<button name="submit" type="submit" value="send">skicka</button>
		<button name="submit" type="reset" value="reset">rensa </button>
		</fieldset>
	</form>

<?php
extract($_POST);
if ($_POST['submit']) { 
				if($name && $subject && $email && $message ) { //kollar så alla fält är ifyllda
								if (return_valid($email)) {
								//$message = about_mail()."\n"."\n".$message; //funktion som tilldelar message en del info 
								$message = about_mail()."\n";
								foreach($_POST AS $key=>$val) {
										$message .= $key .": ". $val ."\n";
									}
							mail($mottagare,$subject,$message,"From: $name <$email>"); // skickar mailet, och message
							$newlog=new logging("logs","log.txt","log.xml"); //instantierar logg klassen
							$newlog->create_txt(); //kör loggfunktioner i logg klassen
							$newlog->create_xml();
							echo "<h2>Meddelandet skickat!</h2>
							<p>Vi svarar så fort vi kan. Skulle det ta för lång tid så skicka ett nytt.</p>"; 
							
							} else {
		 							echo '<p class="red">Felaktig mailadress.</p>';
									}
 			 
 			 } else {
 			 print '<p class="red">Fyll i alla fält</p>'; 
 			 }
  }

// Returnerar sant om det är en korrekt adress.
function return_valid($e_mail) {
if(
ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $e_mail)) {
return TRUE;
}
else {
 return FALSE;
}
}

// returnerar info om adressaten i mailet. i meddelande delens topp.
function about_mail() {
	global $din_site;
		//$headline3="|  obs!, denna info sparas i xml filen log.xml "."\n";
		//$headline2="| ----------------------------------------------"."\n";
		$headline1="Mail ifrån ".$din_site."\n";
		$date.="Den: ".date("D-d-M-Y")."\n";
		$time.="Klockan: ".date("H:i:s")."\n";
		$ip.="Från ip nummer: ".$_SERVER['REMOTE_ADDR']."\n";
		$port.="Adressatens port: ".$_SERVER['REMOTE_PORT']." \n";
		$browser.="Adressatens läsare: ".$_SERVER['HTTP_USER_AGENT']."\n";
		$all = ($headline1.$date.$time.$ip.$port.$browser);
		return "$all";
}

// klass som loggar adressaten
class logging 
{
var $folder;
var $logname;
var $xmlname;
var $filename;
var $dirname;

	function logging($f,$l,$x)
	{
		$this->folder=$f;
		$this->logname=$l;
		$this->xmlname=$x;
		$this->mode=$m;
		if ($this->mode==1)
		{
			$this->filename=getcwd()."\\$this->folder\\$this->logname";
			$this->dirname=getcwd()."\\$this->folder\\";
		}
		else 
		{
			$this->filename=getcwd().'/'.$this->folder.'/'.$this->logname;
			$this->dirname=getcwd().'/'.$this->folder.'/';
		}
	}
	
	
	function create_txt()
	{
		if (!file_exists($this->dirname)) mkdir ($this->dirname);
		$fp = fopen ($this->filename,a);
	$logs="<logging>\n";
		$logs.="<ip> visitor's IP address: ".$_SERVER['REMOTE_ADDR']." </ip>\n";
		$logs.="<port> visitor's port: ".$_SERVER['REMOTE_PORT']." </port>\n";
		$logs.="<browser> visitor's browser: ".$_SERVER['HTTP_USER_AGENT']." </browser>\n";
		$logs.="<date> date: ".date("D-d-M-Y")." </date>\n";
		$logs.="<time> time: ".date("H:i:s")." </time>\n";
		$logs.="</logging>\n\n";
		fwrite($fp,$logs);
		fclose($fp);
	}
	
	function create_xml()
	{
		$filename=$this->xmlname;
		$fp=fopen($this->filename,r);
		$contents=fread($fp,filesize($this->filename));
		$final='<?xml version="1.0" encoding="iso-8859-1"?>'."\n".
			   '<!-- generator="logging class Ver:1.1" -->'.
			   "\n".
			   '<start>'
			   .$contents.
			   '</start>';
		fclose($fp);
		if ($this->mode==1) $fp=fopen($this->dirname."\\$filename",w);
		else $fp=fopen($this->dirname."/$filename",w);
		fwrite($fp,$final);
		fclose($fp);
	}

}
?>
</div>

När man skickar mailet så får jag ett felmeddelande:

Warning: mail() expects parameter 1 to be string, array given in test2.php on line 61

Någon som kan hjälpa mig? Är det något krångligt så behöver ni inte göra er något bekymmer, då struntar jag i det. Men om det är smidigt så får ni gärna ge mig lite kod. Tänk på att jag inte kan något, så tala tydligt. :e

Och du Hoglind, jag tog bort din jättelånga kommentar för att det inte skulle bli överdrivet mycket kod här. Vet inte om man får göra så... men i så fall så får jag redigera senare.

Mvh,
silfver

aasahMedlem sedan mars 20034 471 inlägg
#2

Re: Varning i mailformulär

silfver skrev:

$mottagare = array(
'1' => array('namn', 'mail'),
'2' => array('namn', 'mail'),
'3' => array('namn', 'mail'),
'4' => array('namn', 'mail'),
'5' => array('namn', 'mail')
)
....
mail($mottagare,$subject,$message,"From: $name <$email>"); // skickar mailet, och message
....

Precis som felmeddelandet säger förväntar sig mail argument enligt: (minst)
bool mail (string to, string subject, string message)

$mottagare är just en array. Och en array är inte en string...

Alltså kan du lösa det i stil med:

foreach($mottagare as $k => $a) {
   mail($a[1], $subject, $message, "From: $a[0] <".$a[1].">");
}

Fast... har vissa namn flera epostadresser? Annars kunde du ju definiera

$mottagare = array(
    'namn1' => 'mail1',
    'namn2' => 'mail2',
    'namn3' => 'mail3',
    'namn4' => 'mail4',
    'namn5' => 'mail5',
)
//...
foreach($mottagare as $k => $a) {
   mail($a, $subject, $message, "From: $k <$a>");
}

Så slapp du 2-dim array...

fiddlerMedlem sedan juli 20023 617 inlägg
#3

Går det inte att fånga upp 'to' som en array?

silfverMedlem sedan apr. 200312 679 inlägg
#4

Re: Re: Varning i mailformulär

aasah skrev:

Precis som felmeddelandet säger förväntar sig mail argument enligt: (minst)
bool mail (string to, string subject, string message)

$mottagare är just en array. Och en array är inte en string...

Alltså kan du lösa det i stil med:

foreach($mottagare as $k => $a) {
   mail($a[1], $subject, $message, "From: $a[0] <".$a[1].">");
}

Jag använde mig av den koden! Funkade prima. Men du missuppfattade mig lite. Jag vill inte att den ska skicka mail till alla i Arrayen, utan bara till den man väljer. Eller var det så du menade med ditt sista exempel?

aasahMedlem sedan mars 20034 471 inlägg
#5

Re: Re: Re: Varning i mailformulär

silfver skrev:

... Men du missuppfattade mig lite. Jag vill inte att den ska skicka mail till alla i Arrayen, utan bara till den man väljer. ...

Var någonstans - och hur - kommunicerar du detta till ditt skript? Så vitt det ser ut i mina ögon försöker du stoppa in den 2-dim arrayen i $to-delen.

Om du har ett visst värde $ix som motsvarar indexet i $mottagare för det namn du vill skicka till, så borde det bli:

mail($mottagare[$ix][1],$subject,$message,"From: $mottagare[$ix][0] <$mottagare[$ix][1]>");

$mottagare[$ix] = array('namn', 'mail') för ett visst index.
$mottagare[$ix][1] = 'mail'

silfverMedlem sedan apr. 200312 679 inlägg
#6

Re: Re: Re: Re: Varning i mailformulär

aasah skrev:

silfver skrev:

... Men du missuppfattade mig lite. Jag vill inte att den ska skicka mail till alla i Arrayen, utan bara till den man väljer. ...

Var någonstans - och hur - kommunicerar du detta till ditt skript? Så vitt det ser ut i mina ögon försöker du stoppa in den 2-dim arrayen i $to-delen.

Om du har ett visst värde $ix som motsvarar indexet i $mottagare för det namn du vill skicka till, så borde det bli:

mail($mottagare[$ix][1],$subject,$message,"From: $mottagare[$ix][0] <$mottagare[$ix][1]>");

$mottagare[$ix] = array('namn', 'mail') för ett visst index.
$mottagare[$ix][1] = 'mail'

Jag har ingen aning om vad du menar. :l Men jag använder ju Hoglinds mailformulär (v3.1) men gillade funktionen som Tinwëlint gjorde på: http://www.webforum.nu/showthread.php?s=&threadid=107006&forumid=151
fast det saknas en massa funktioner tycker jag.

Så det finns inget smidigt sätt att ordna så att jag får det som jag vill utan att skriva om allt?

fiddlerMedlem sedan juli 20023 617 inlägg
#7
<?php
foreach ($mottagare as $key => $val) {
echo "<option value=\"$val[1]\">$val[0]</option>\n";
//i den här selecten väljs personen man vill skicka till
}
?>
mail($to,$subject,$message,"From: $name <$email>");

Testa ovanstående ändringar.

silfverMedlem sedan apr. 200312 679 inlägg
#8

fiddler skrev:

<?php
foreach ($mottagare as $key => $val) {
echo "<option value=\"$val[1]\">$val[0]</option>\n";
//i den här selecten väljs personen man vill skicka till
}
?>
mail($to,$subject,$message,"From: $name <$email>");

Testa ovanstående ändringar.

Det funkade rätt bra, men jag får två mail i stället för ett. :p

r/ Hm. Det verkar som om man får ett mail ibland, och två kopior ibland! Vad är det för fel?! :e

fiddlerMedlem sedan juli 20023 617 inlägg
#9

Får du två? Märkligt... :(

Ändringen jag gjorde gör att adresserna syns i koden. Det kanske inte var så bra. Jag fixar till det när jag får tid senare idag.

silfverMedlem sedan apr. 200312 679 inlägg
#10

fiddler skrev:

Får du två? Märkligt... :(

Ändringen jag gjorde gör att adresserna syns i koden. Det kanske inte var så bra. Jag fixar till det när jag får tid senare idag.

Ja, eller fler än två. Vet inte riktigt hur många gånger jag testade att skicka, men det ploppade in mail fortfarnade efter 15 minuter. :p Fast jag fick väl runt 15 stycken också. Men att det tar tid att få mailet, har det med scriptet eller mailservern att göra?

fiddlerMedlem sedan juli 20023 617 inlägg
#11

Att det tar tid har med servern att göra.

fiddlerMedlem sedan juli 20023 617 inlägg
#12

Ändra tillbaka

$val[1] till $key

samt ändra mail-raden till:

mail($mottagare[$to][1],$subject,$message,"From: $name <$email>");

...och håll dina fingrar i styr och skicka bara ett mail när du testar... ;)

aasahMedlem sedan mars 20034 471 inlägg
#13

silfver skrev:

... Ja, eller fler än två. Vet inte riktigt hur många gånger jag testade att skicka, men det ploppade in mail fortfarnade efter 15 minuter. :p Fast jag fick väl runt 15 stycken också. Men att det tar tid att få mailet, har det med scriptet eller mailservern att göra?

Varje gång du backar tillbaka till sidan kommer mailet att skickas på nytt. Likadant om du är kvar på sidan efter att ha skickat iväg det och trycker på refresh...

silfverMedlem sedan apr. 200312 679 inlägg
#14

fiddler skrev:

Ändra tillbaka

$val[1] till $key

samt ändra mail-raden till:

mail($mottagare[$to][1],$subject,$message,"From: $name <$email>");

...och håll dina fingrar i styr och skicka bara ett mail när du testar... ;)

Det resulterar fortfarande i TVÅ mail. Tyvärr. Och jag håller fingrarna i styr. ;)

assah skrev:

Varje gång du backar tillbaka till sidan kommer mailet att skickas på nytt. Likadant om du är kvar på sidan efter att ha skickat iväg det och trycker på refresh...

Hehe, ja så långt är jag med. ;) Vet inte vad som hände, den bara spammade mail. :p

r\ kod:

		<?php
		foreach ($mottagare as $key => $val) {
		echo "<option value=\"$key\">$key</option>\n";
		//i den här selecten väljs personen man vill skicka till
		}
		?>

Så ser den ut. Sen använde jag den du skrev sist. Rätt så annars? Och sen i min array på sidan, så kan jag bara välja mellan 1, 2 och 3, inga namn alltså. :o

Tre mail nu...

fiddlerMedlem sedan juli 20023 617 inlägg
#15
		<?php
		foreach ($mottagare as $key => $val) {
		echo "<option value=\"$key\">$val[0]</option>\n";
		//i den här selecten väljs personen man vill skicka till
		}
		?>

Kanske var otydlig... :)

Tre mail? :( :q

silfverMedlem sedan apr. 200312 679 inlägg
#16

fiddler skrev:

		<?php
		foreach ($mottagare as $key => $val) {
		echo "<option value=\"$key\">$val[0]</option>\n";
		//i den här selecten väljs personen man vill skicka till
		}
		?>

Kanske var otydlig... :)

Tre mail? :( :q

Eller så är det jag som inte förstår... :) Nu har jag kommit på vad som är fel. Kolla in detta

<?php
$mottagare = array(
    '1' => array('namn ett', 'mail1@mail.com'),
    '2' => array('namn två', 'mail2@mail.com'),
    '3' => array('namn tre', 'mail3@mail.com')
)
//för de olika personer man ska kunna välja att skicka till.
?>

Jag får så många mail, som namnet jag väljer. Väljer jag namn tre får jag tre mail, namn ett ger bara ett mail. Skumt va? :P

r\ Glöm det jag sa. Nu fick jag två mail till. :x

fiddlerMedlem sedan juli 20023 617 inlägg
#17

Skulle alltså

mail($mottagare[$to][1],.....);

ställa till det på något sätt...? Testa såhär då:

$to = $mottagare[$to][1];
mail($to, $subject...osv);
silfverMedlem sedan apr. 200312 679 inlägg
#18

fiddler skrev:

Skulle alltså

mail($mottagare[$to][1],.....);

ställa till det på något sätt...? Testa såhär då:

$to = $mottagare[$to][1];
mail($to, $subject...osv);

Jag tror jag väntat tillräckligt länge. Det kom inget mail alls. :(

silfverMedlem sedan apr. 200312 679 inlägg
#19

Det verkar som om det är ordnat nu. Tog lite tid för första mailet, men andra var inga problem att skicka. Tack fiddler!

fiddlerMedlem sedan juli 20023 617 inlägg
#20

:bire

(Jag kommer att stjäla bitar av koden basåruvet...)

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)