Das mit dem mysqli habe ich nun erledigt... aber warum kommt dann die Fehlermeldung?
Welche Fehlermeldung?
Das mit dem mysqli habe ich nun erledigt... aber warum kommt dann die Fehlermeldung?
Welche Fehlermeldung?
http://de1.php.net/manual/de/mysqli.query.php
mysqli_query() gibt einfach false zurück, weil die db "nichts gefunden hat". (hat ja wolf schon gesagt)
In solchen Fällen immer die Query ausgeben und in (zB) phpMyAdmin testen.
$sQl = mysql_query("INSERT INTO ON DUPLICATE KEY UPDATE rangliste_neu4 (name, ".$monat2.") VALUES ('$name', '$monat')");
Hast Du das mal getestet?
Nein.
Aber jede Tabelle sollte einen eindeutigen Ident besitzen.
Normalerweise ist das ein Feld:
und nochmal zur besseren Übersicht:
`id` -- name der spalte
UNSIGNED INT -- integer (ganze zahl) (UNSIGNED bedeutet keine vorzeichen - also "kein minus", nur positive zahlen)
NOT NULL -- kein datensatz darf in diesem feld den wert NULL (nicht gesetzt) besitzen
AUTO_INCREMENT -- ~"zähle diesen wert automatisch hoch"
PRIMARY KEY -- dieses feld ist der primäre schlüssel, also eine eindeutige id
"ON DUPLICATE KEY UPDATE" greift hier immer dann, wenn Du ein INSERT auf eine `id` versuchst, die es bereits gibt.
Aber auch
wenn Du zB ein Feld `name` auf den Index-Type "UNIQUE" (einzigartig) stellst.
Also ein bissl musste auch selbst machen =)
Ja, geht. Nennt sich "ON DUPLICATE KEY UPDATE".
Bsp:
INSERT INTO
`tbl_name`
SET
`col_name` = 'abc',
`col_name_2` = 'x'
ON DUPLICATE KEY UPDATE -- wenn ein einzigartiger (unique) schlüssel schon existiert, dann update
`col_name_2` = 'x'
EDIT:
Dabei ist aber zu beachten, dass eine evtl `id` AUTO_INCREMENT "trotzdem" hochgezählt wird.
Heißt:
angenommen
`id`(PRIMARY KEY , AUTO_INCREMENT) ist momentan bei 1
und du schickst diese Query ab:
INSERT INTO
`tbl_name`
SET
`id` = '1',
`col_name` = 'value'
ON DUPLICATE KEY UPDATE
`col_name` = 'value'
dann wird beim nächsten INSERT (einem wirklich neuem Datensatz) die `id` 3 sein.
Denn mysql Server behandelt dieses Statement wie 2 Anfragen:
ein INSERT und ein UPDATE.
Dabei geht er in etwa so vor:
- starte INSERT auf `id` 1
- zähle AUTO_INCREMENT +n (normalerweise +1)
- INSERT auf `id` 1 schlug fehl - Schlüssel existiert bereits
- UPDATE auf `id` 1
der "interne" AUTO_INCREMENT (-Wert) für den nächsten einzufügenden Datensatz ist also schon um 1 erhöht,
auch wenn er bei der letzten Anweisung nicht genutzt wurde.
Zu dem Thema findet man einiges im Netz - Stichworte "mysql id gaps on duplicate key update"
TYPE ist hier das Problem. Da gehört ENGINE hin.
Siehe: PHP MyAdmin Fehler #1064 beim laden von einer Tabelle in Form einer Tex datei
es gab glaub ich mal Probleme, wenn Skype aktive war. Dann konnte Apache nicht gestartet werden. (war irgendwas mit port 80)
Das kannst Du bei der Verkettung machen.
$headers = 'From: ' . $_POST['Vorname'] . ' ' . $_POST['Nachname'] . ' ' . $_POST['Email']. "\r\n" .
nochmal an einem anderen Bsp:
$var = 'text ' . // mit punkt verkettet
' ' . // ein leerzeichen, und wieder der punkt zum verketten
' text text ' . ' ' . ' noch mehr text ' . $bsp_var;
Kann verwirren. Du könntest ein Leerzeichen auch in eine Variable packen:
"From" ist der Sender, also der Absender, der Server.
Wenn Du also ein Kontaktformular hast, welches den Inhalt zu Dir selbst schickt,
dann ist der Absender "From" der Server.
// am Beispiel #2 von http://php.net/manual/de/function.mail.php
$empfaenger = 'niemand@example.com';
$betreff = 'Der Betreff';
$nachricht = 'Hallo';
$absender = 'admin@' . $_SERVER['SERVER_NAME'];
$header = 'From: ' . $absender . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($empfaenger, $betreff, $nachricht, $header);
Alles anzeigen
Bissl spät oder?
oO?
Wo wir gerade das wieder oben haben:
nutze seit einiger Zeit mein "Bettel-Script". Der Sinn dahinter soll sein, den Nutzer dazu zu bewegen den Adblock zu deaktivieren.
Die Zahlen zeigen mir seit rund 2 Monaten, dass mehr Nutzer als gedacht darauf positiv reagieren - sprich: den Adblock deaktivieren.
Hier das simple Script:
(kein HickHack - free for use/change/what ever ... Verbesserungsvorschläge erwünscht)
(die ad ist ~deaktiviert, aber zum Testen reichts -- wenn Adblock an, dann Meldung)
<!DOCTYPE html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
document.onreadystatechange = function(){
if(document.readyState == "complete"){
/*START abblock check*/
var ab = function(){
var b = false;
for(var key in window.adsbygoogle){
if(
key != "push"
&& typeof window.adsbygoogle[key] != "function"
&& window.adsbygoogle[key].length != 1
){
b = true;
}
}
if(b){
var e = document.createElement("div");
e.setAttribute(
"style",
"display:block;position:fixed;bottom:10px;right:10px;background:#123456;color:#abcdef;padding:13px;font-size:25px;"
);
e.innerHTML = "This service is free and lives from advertising!<br>Please turn off your Adblock.<br>Thank you!";
document.getElementsByTagName("body")[0].appendChild(e)
}
}
ab();
delete(ab);
/* END abblock check*/
}
}
</script>
</head>
<body>
<!-- google ad -->
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
style="display:inline-block;width:160px;height:600px"
data-ad-client="ca-pub-***"
data-ad-slot="***"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
<!-- /google ad -->
</body>
</html>
Alles anzeigen
Eine selbstgebaute Seite ist besser für dein Ego
Japp ![]()
CMS oder Framework, oder "Mini-CMS-Framework" oder was auch immer ...
Das beste für Dich selbst ist, wenn Du Dir ansiehst wie es (richtig) geht, und dann selbst schreibst.
Bsp Dateiupload:
Du siehst Dir an, was alles beachtet werden muss, schreibst Dir ein Tool (Funktion oder Klasse) und weißt dadurch
- wie es geht
- dass Du es nicht immer wieder komplett von null schreiben musst
- dass Du keine (wie The Scout schon sagte) "Standardfehler" nutzt
- keiner auf Anhieb weiß, ob oder wo Du evtl Sicherheitslücken hast
Ich hoffe das war einigermaßen verständlich
Ja, doch =)
mit ner anonymen Funktion ist es mMn dann am sinnvollsten. Denn wenn this in der Methode "auf einmal" der Button ist, verwirrt das nur unnötig ![]()
Falls es jemand noch mal testen möchte:
MyClass =
{
container :null,
button :null,
textfield :null,
init:function()
{
this.container = document.getElementById("container");
this.textfield = document.getElementById("textfield");
this.button = document.getElementById("button");
// variante 1:
this.button.addEventListener('click', function(){MyClass.change1();}, false);
// variante 2:
this.button.addEventListener('click', this.change2, false);
return;
},
// variante 1:
change1:function()
{
// this ^= object (MyClass)
this.container.innerHTML = this.textfield.value;
return;
},
// variante 2:
change2:function()
{
// this ^= html element (button)
MyClass.container.innerHTML = MyClass.textfield.value;
return;
}
}
Alles anzeigen
Das funktioniert schon mal
Danke.Verstehe aber nicht, warum this.button.onclick nicht funktioniert.
EDIT: ich Depp - habs ja nicht kopiert, sondern durch die Klammern () ausgeführt.
Und bekommt man denn nicht irgendwie this (das Objekt von MyClass) in die Methode?
Hab das bisher auch immer mit direktem Name angesprochen, aber das muss doch in JS möglich sein.
Das hier funzt leider nicht:
this.button.addEventListener('click', this.change(this), false); // this an change() übergeben
// ...
change:function(obj) // this als obj entgegen nehmen
{
//alert(this.textfield.value)
/*this.container.innerHTML = this.textfield.value;*/
obj.container.innerHTML = obj.textfield.value;
return;
}
Moin, irgendwie steh ich aufm Schlauch.
Ich komm nicht dahinter, wieso die onclick Funktion nicht mach, was sie soll:
<!DOCTYPE html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
MyClass =
{
container :null,
button :null,
textfield :null,
init:function()
{
this.container = document.getElementById("container");
this.textfield = document.getElementById("textfield");
this.button = document.getElementById("button");
// erster versuch: Uncaught TypeError: undefined is not a function
/*this.button.onclick = function(){this.change()};*/
// zweiter versuch: wird sofort ausgefürt, aber nicht onclick (was es ja soll)
this.button.onclick = this.change();
return;
},
change:function()
{
//alert(this.textfield.value)
this.container.innerHTML = this.textfield.value;
return;
}
}
document.onreadystatechange = function(){
if(document.readyState == "complete"){
MyClass.init();
}
}
</script>
</head>
<body>
<div id="container">hier soll der inhalt vom textfiel onclick rein</div>
<input type="text" id="textfield" value="" />
<button id="button">do</button>
</body>
</html>
Alles anzeigen
Wie bekomm ich denn das onclick da "rein" oO?
"versteckt.php"
mach sowas nicht. Sowas wird Verschleierung genannt und ist nicht sicher.
Sicher ist, wenn es "egal" ist, ob es jemand kennt, aber trotzdem keiner "ran" kommt.
Angenommen Du hast
- index.php
- admin.php
- login.php
- logout.php
Dann ruft Nutzer beim Aufruf der URL (http://deine-seite.de) die index.php auf.
Da drin hast Du Deine Navigation
"Startseite | Bilder | Admin".
Auf der Startseite braucht niemand eingeloggt zu sein. Die Bilder darf auch jeder sehen.
Aber die Seite Admin braucht einen Login.
Hinter dem Admin-Button ist ein Link zu "admin.php".
In der admin.php kommt nun eine Prüfung, ob Nutzer eingeloggt ist. Wenn nicht: umleiten zum Login
admin.php
session_start();
if(!isset($_SESSION['logged_in']) or $_SESSION['logged_in'] !== true){
// wenn session logged_in nicht existiert, oder "nicht genau" der wert und typ true ist
header("Location: login.php");
exit();
}
// hier kommt man nun nur hin, wenn man eingeloggt ist
// dein inhalt ...
Alles anzeigen
Wie The Scout schon sagte: Skript beenden, damit nichts passiert, falls header versagt.
Aber auch wenn header() funktioniert, wird das Script durch header() nicht beendet.
Also nach header() immer exit() (sehr selten will man, dass es weiter läuft).
Der Nutzer landet in der login.php und muss sich anmelden.
Dort sollte man auch gleich prüfen, ob denn Nutzer schon eingeloggt ist.
Denn er kann ja die Seite auch manuell aufrufen. Wenn er also schon eingeloggt ist,
dann kann man zB eine Meldung ausgeben wie: "Du bist schon angemeldet".
login.php
session_start();
// ist nutzer schon eingeloggt?
if(isset($_SESSION['logged_in']) and $_SESSION['logged_in'] === true){
echo "Du bist schon eingeloggt";
// die last_action setzen zwecks timeout:
$_SESSION['last_action'] = time();
exit(); // und ende
}
// hier kommt man nun nur hin, wenn man NICHT eingeloggt ist
// form gerade abgeschickt?
if(isset($_POST['submit'])){
// hier deine form prüfen
// isset(...name ...) und nicht leer
// isset(...pw ...) und nicht leer
// und stimmt name und pw ...
// ...
// wenn alles in ordnung, dann setzt du die logged_in session:
if(/* ... alles ok ... */){
$_SESSION['logged_in'] = true;
echo "Du hast Dich angemeldet ...";
// die last_action setzen zwecks timeout:
$_SESSION['last_action'] = time();
exit(); // und ende
}
}
// hier kommt man auch nur hin, wenn man NICHT eingeloggt ist
// (wenn formular zB abgeschickt wurde und nutzer nun eingeloggt ist braucht er das formular nicht mehr)
?>
<form ...>
<!-- deine form ... -->
</form>
Alles anzeigen
Jetzt der Logout-Button:
Hinter dem Logout-Button ist ein Link zu "logout.php".
logout.php
session_start();
// ist denn nutzer eingeloggt? wenn nicht, kann man ihn nicht ausloggen:
if(!isset($_SESSION['logged_in']) or $_SESSION['logged_in'] !== true){
// wenn session logged_in nicht existiert, oder "nicht genau" der wert und typ true ist
// meldungen kann man sich hier sparen. eine weiterleitung macht wohl mehr sinn:
header("Location: login.php");
exit();
}
// hier kommt man nun nur hin, wenn man eingeloggt ist
// nutzer ist eingeloggt und will ausgeloggt werden:
$_SESSION['logged_in'] = false;
echo "Du hast Dich abgemeldet";
Alles anzeigen
Das wäre ein einfacher Login.
Jetzt zum Timout:
In der admin.php baust Du The Scout´s check ein:
admin.php
session_start();
if(!isset($_SESSION['logged_in']) or $_SESSION['logged_in'] !== true){
// wenn session logged_in nicht existiert, oder "nicht genau" der wert und typ true ist
header("Location: login.php");
exit();
}
// hier kommt man nun nur hin, wenn man eingeloggt ist
// hier nun the scout´s check:
$now = time(); // Aktuelle Zeit, dann muss die nur einmal ausgelesen werden
$diff = 10; // Zeit in Sek, nach denen ausgeloggt wird
if (!isset($_SESSION["last_action"]) OR empty($_SESSION["last_action"])
OR $_SESSION["last_action"] + $diff < $now)
// Gucken, ob die Session da, gefüllt, und "jung genug" ist, falls nicht ...
{
$_SESSION["last_action"] = $now; // ... Session aktualisieren ...
header("Location: login.php"); // ... Seite wechseln ...
exit(); // ... und Skript beenden, damit nichts passiert, falls header versagt
}
else // Wenn mit der Zeit alles stimmt
{
$_SESSION["last_action"] = $now; // Damit das wieder stimmt
/**
* Hier kommt dann der Content hin, der geschützt werden soll
*/
}
Alles anzeigen
EDIT:
in der bilder.php (und allen anderen Seiten) musst Du den Zeitstempel "last_action" auch aktualisieren:
bilder.php
seitens PHP:
$_COOKIE
oder
$_SESSION
(oder Datenbank, oder Memory).
Du musst Dir halt irgendwo hinschreiben, wann die letzte Aktion war.
Dann prüfst Du, ob die letzte Aktion länger her ist, als von Dir gewünscht.
zB
Was verstehst Du unter "Daten Desinfektionen" ?
HTML-Seminar.de - mit Videos zum schnellen Lernen, wie man eine Website selbst erstellt.