MeleaMedlem sedan juli 20033 147 inlägg Hejsan wF!
Har byggt en funktion som skickar massmail till alla besökare på sidan. Problemet blir dock att det blir Fatal error och det står att tiden på 30 sekunder har blivit "exceded".
Vad kan man göra åt detta?
Såhär ser koden ut:
if($_POST[to] == 1) {
$till = "where access = 1";
} elseif($_POST[to] == 2) {
$till = "where access = 2";
} elseif($_POST[to] == 3) {
$till = "where access = 3";
} elseif($_POST[to] == 4) {
$till = "where access = 4";
} elseif($_POST[to] == 5) {
$till = "";
}
$SQL = mysql_query("SELECT * FROM lan_members $till") or die (mysql_error());
while($objRS = mysql_fetch_array($SQL)) {
/* message */
$message = "<html>
<head>
<title>Birthday Reminders for August</title>
</head>
<body>".nl2br($_POST['contact'])."</body>
</html>";
/* To send HTML mail, you can set the Content-type header. */
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
/* additional headers */
$avsandare = $_POST['writer_email'];
$headers .= "From: $avsandare\r\n";
$headers .= "Reply-To: $avsandare";
/* and now mail it */
mail($objRS['email'], $_POST['topic'], $message, $headers);
}
Header ("Location: ../?i=contact&action=massmail");
Jag väljer alltså i en dropdown meny till vilka jag ska skicka mailet, det är just vad If satsen listar ut.
Är det någon iställningar man måste göra? Och kan jag göra det om jag har Loopia?
Tack på förhand.
lunne82Medlem sedan dec. 2003153 inlägg Du ska nog ta en titt på set_time_limit i manualen.
Men det vore kanske bättre att ta en titt på program lämpade för massutskick?
MeleaMedlem sedan juli 20033 147 inlägg Jo, jag tänkte dela upp antalet användare i olika sektioner, med sådär 20 i varje... hur gör jag det med automatik?
mvh
lunne82Medlem sedan dec. 2003153 inlägg Du kan göra såhär för att skicka 20 mail åt gången. Du får sköta finliret själv, lägger bara ut idén här nu.
Byt ut din nuvarande rad $SQL = mysql_query(...) med dessa:
$start = 0;
if (isset($_GET['mail']) && $_GET['mail'] > 0) {
$start = $_GET['mail'];
}
$SQL = mysql_query("SELECT * FROM lan_members $till LIMIT $start,20") or die (mysql_error());
Detta gör så att scriptet fortsätter så länge det får ut nya mailadresser ur databasen...
Byt ut din nuvarande Header-rad mot detta:
if (mysql_num_rows($SQL) > 0) {
$next = $start + 20;
Header ("Location: ../?i=contact&action=massmail&mail=$next");
}else{
Header ("Location: ../?i=contact&action=massmail");
}
Nu är det sent för mig, så "användning sker på egen risk"... :)
MeleaMedlem sedan juli 20033 147 inlägg Ah! Tack så hemskt mycket, det ska nog göra susen. Är också lite sent för mig så testar det imorgon! :)
MeleaMedlem sedan juli 20033 147 inlägg Uhm, fick en liten funderar nu innan jag vågar mig på att använda koden... border inte variablen $next = $start + 20; ligga ovanför loopen?
lunne82Medlem sedan dec. 2003153 inlägg Det spelar ingen roll vart den ligger, bara den ligger under detta:
if (isset($_GET['mail']) && $_GET['mail'] > 0) {
$start = $_GET['mail'];
}
MeleaMedlem sedan juli 20033 147 inlägg Hm, är det inte så att alla $_POST[]:s försvinner när jag redirectar till contact.php igen? Hur som helst så stannar den på mail=20 i queryn. Såhär ser koden ut nu:
if($_POST[to] == 1) {
$till = "where access = 1'";
} elseif($_POST[to] == 2) {
$till = "where access = 2";
} elseif($_POST[to] == 3) {
$till = "where access = 3";
} elseif($_POST[to] == 4) {
$till = "where access = 4";
} elseif($_POST[to] == 5) {
$till = "";
}
$start = 0;
if (isset($_GET['mail']) && $_GET['mail'] > 0) {
$start = $_GET['mail'];
}
$SQL = mysql_query("SELECT * FROM lan_members $till LIMIT $start,20") or die (mysql_error());
while($objRS = mysql_fetch_array($SQL)) {
/* message */
$message = "<html>
<head>
<title>Birthday Reminders for August</title>
</head>
<body>".nl2br($_POST['contact'])."</body>
</html>";
/* To send HTML mail, you can set the Content-type header. */
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
/* additional headers */
$avsandare = $_POST['writer_email'];
$headers .= "From: $avsandare\r\n";
$headers .= "Reply-To: $avsandare";
/* and now mail it */
mail($objRS['email'], $_POST['topic'], $message, $headers);
}
if (mysql_num_rows($SQL) > 0) {
$next = $start + 20;
Header ("Location: contact.php?action=all&mail=$next");
} else {
Header ("Location: ../?i=contact&action=massmail");
}
Hoppas innerligt att någon vill hjälpa mig med detta, måste vara klart tills ikväll.
Tack på förhand!
Mvh
lunne82Medlem sedan dec. 2003153 inlägg if($_POST[to] == 1) {
$till = "where access = 1'";
} elseif($_POST[to] == 2) {
$till = "where access = 2";
} elseif($_POST[to] == 3) {
$till = "where access = 3";
} elseif($_POST[to] == 4) {
$till = "where access = 4";
} elseif($_POST[to] == 5) {
$till = "";
}
Ändra till:
if (isset($_POST[to]))
$to = $_POST[to];
else
$to = $_GET[to];
if($to == 1) {
$till = "where access = 1'";
} elseif($to == 2) {
$till = "where access = 2";
} elseif($to == 3) {
$till = "where access = 3";
} elseif($to == 4) {
$till = "where access = 4";
} elseif($to == 5) {
$till = "";
}
Och sen ändrar du
Header ("Location: contact.php?action=all&mail=$next");
till
Header ("Location: contact.php?action=all&mail=$next&to=$to");
Sen är det bara att hålla tummarna. :)
MeleaMedlem sedan juli 20033 147 inlägg Hm! Nu kom jag på att mailet bara skickades ut till 20 st av dom. Eftersom $_POST['writer_email'], $_POST['topic'] och $_POST['contact'] inte finns efter det antalet... Hur löser jag detta? Hur sparar jag allting om och om igen? $_POST['contact'] innehåller ju i stort sett hur mkt som helst, går inte och ha det i queryn väl?
Mvh
/R Fick lösa det genom att använda Sessioner.
lunne82Medlem sedan dec. 2003153 inlägg Jasså, missade dem. :)
Du skulle ju kunna göra så att du sparar texten som ska skickas i en tabell i databasen, sen hämtar du det där och skickar till alla... det är kanske enklare.
MeleaMedlem sedan juli 20033 147 inlägg Mjo, men fick göra en paniklösning igårkväll... ska fixa det lite bättre idag... Finns det inte en funktion i SQL / PHP som hämtar det senaste id:et i databasen? Eller måste man skriva LIMIT 1?
Mvh
lunne82Medlem sedan dec. 2003153 inlägg Nej, du får formulera SQL-frågan så den hämar det du vill ha.
SELECT sak FROM tabell WHERE krav=1 ORDER BY id DESC LIMIT 1;
Det är nog det mest optimerade, du kan även köra
SELECT sak FROM tabell HAVING id=MAX(id);
Men HAVING optimeras inte på något sätt av MySQL, så det bör man undvika om man kan.
Alpha IIMedlem sedan maj 20002 993 inlägg Spara alla POST fält som en session. Skrev ett exakt likadant script igår :)