Moin,
Wow das geht auch so? Das wusste ich garnicht. Das ist ja richtig genial.
Danke ![]()
Grüße,
Stef
Moin,
Wow das geht auch so? Das wusste ich garnicht. Das ist ja richtig genial.
Danke ![]()
Grüße,
Stef
Hey,
Okay. Ich habe gelesen, dass das neue PDO dies nicht mehr unterstützt.
Augustus :
Zeig uns dann bitte mal deinen aktuellen Code her. Denn wenn du meine Fehlerbehandlung in meinem letzten Beitrag durchgeführt hättest gebe es keine Fehler und Probleme mehr.
Hey,
dein Code ist überhaupt nicht leserlich. Und durch diese Entertaste nach der Function führst du diese auch garnicht aus. Desweiteren ist ein Fehler in der Insert-Query enthalten.
Das A und O im Programmieren ist leserlicher Code. Dein Code wäre so für mich leserlich:
$dbv = new mysqli("localhost","root","","test");
$stmt2 = $dbv->prepare("INSERT INTO test VALUE ( ?, ? ) ") ;
$stmt2->bind_param("is", $_POST['idstadt'], $_POST['stadt']);
$stmt2->execute();
$stmt = $dbv->prepare("INSERT INTO anmeldung VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param("issss", $_POST['ID'], $_POST['vorname'], $_POST['nachname'], $_POST['idstadt'], date("d.m.Y H:i:s"));
$stmt->execute();
So wird auch die Funktion ausgeführt. Somit sind 2 Fehler behoben. Der letzte Fehler ist in der Insert-Query.
Wenn du so den Code ausführst bekommst du doch eine Fehlermeldung ? Wenn nein schalte das Error Reporting an.
Der Fehler lautet: Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in Zeile ....
Was sagt der Fehler aus?
Die prepare Function gibt den boolean False zurück, weil die Query falsch ist. VALUE gibts nicht.
Die richtige Insert-Query sieht so aus: INSERT INTO deineTabelle (feld1, feld2, feld3) VALUES (? , ? , ?);
Grüße,
Stef
Hey,
wie bereits erwähnt kannst du nicht gleichzeitig mehrere Tabellen füllen. Auser du benutzt Mysqli. Dort gibt es folgende Funktion: multi_query().
Mit dieser kannst du multiple SQL-Codes ausführen.
PDO unterstützt dies nicht.
Eine Möglichkeit wäre eine Funktion zu erstellen welche dies unterstützt.
Beispiel:
<?php
function executeMultipleQuerys(string $query, $datenbankverbindung, int $anzahlDerDatenbankabfragenPlusEins){
$querys = explode(";", $query);
$i = 0;
foreach ($querys as $key => $query) {
if($key < $anzahlDerDatenbankabfragenPlusEins){
$stmt = $datenbankverbindung->prepare($query);
$stmt->execute(
array(
":value" => $querys[$i + 1]
)
);
$i++;
}
}
}
$dbv = new PDO("mysql:host=127.0.0.1;dbname=test;charset=utf8" , "root", "");
$query = "INSERT INTO test (value) VALUES (:value); Wert1; INSERT INTO test (value) VALUES (:value); wert2 ";
executeMultipleQuerys($query, $dbv, 3);
Alles anzeigen
Da ist hinter der jeweiligen Query die Insert Value.
Zitat
Das würde bedeuten, wenn ich 20 Tabellen hätte, dass ich 20 INSERTS machen muss ?
Normalerweise ja.
Zitat
Was mir auch nicht klar ist, wird die ID im Sekundärschlüssel automatisch von Sql eingefügt oder muss man das über PHP programmieren, einerseits das der Primärschlüssel nicht doppelt vorkommt ? Hat das Feld in der Datenbank mit dem Sekundärschlüssel eine bestimmte Eigenschaft, Bezeichnung wo man mitgeben muss ? Wie müsste der Code aussehen ?
In der normalen Tabelle wird das erste Feld mittels Auto_Increment immer hochgezählt. Dieses Feld besitzt dann die eindeutige Id. Nun musst du diese noch in die andere Tabelle bekommen. Um dies zu schaffen brauchst du nochmals ein Insert welches die Id mit einer Value in die 2 Tabelle einträgt.
Davor musst du dann noch die eindeutige Id aus der anderen Tabelle fetchen. Denn es kann immer vorkommen, dass die Ids nicht übereinstimmen.
Grüße,
Stef
Hey,
du kannst in eine DB-Abfrage mehrere Tabellen mit Joins verbinden. So kannst du mehrere Tabellen abfragen und die UserID welche z.b in der Termintabelle steht mit der Usertabelle verknüpfen und den Namen der jeweiligen ID aus der DB fetchen.
Grüße,
Stef
Hey,
Zeig uns mal bitte was du dazu gefunden hast.
Grüße,
Stef
Crossposting ist nicht erlaubt. Siehe dazu auch unsere Regeln.
Dieses Thema wird nun trotz entfernen des Postinhaltes im anderen Forum gesperrt.
Hey,
Wow. Vielen Dank für die sehr ausführliche Beschreibung und Erklärung sowie deiner Sichtweise zu dem Aufbau dieser Applikation.
Daraus kann man sehr viel lernen und aufnehmen.
Daran habe ich nicht mehr gedacht und alles in eine Klasse gepackt.
Eigentlich ist die Klasse ja das Objekt. Nehmen wir z.b. ein Auto. Die Eigenschaften sind dann z.b. der Motortyp, Benzintyp, usw. Und die Methoden sind dann z.b. Aktionen wie Tanken, Fahren oder Auto putzen.
Wenn Du Interesse hast, kann ich Dir gern mal eine kleine funktionierende Beispiel-Buchung auf so einer Basis aufbauen, dann kannst Du damit ja mal rumspielen. Wird allerdings erst am WE was, weil ich morgen für drei Tage beruflich unterwegs bin.
Sehr gerne. Ich werde auch dann mal von meiner Seite es so erstellen. Dann kan man ja beides vergleichen. Aber das dauert bestimmt bis Sonntag.
Grüße,
Stef
Hey,
vielen Dank Arne Drews. Ich habe es jetzt so eingermaßen verstanden.
Wenn man $this zurückgibt dann gibt man wenn man die Function ausführt die ganze Klasse zurück und somit kann man auf dieser die andere Function ausführen weil diese dort verfügbar ist. Wie ich das jedenfalls mit mehr als 2 Functionen machen soll weiß ich noch nicht. Werde es aber aufjedenfall austesten.
Ich habe den Code nochmal komplett neu erstellt und möchte euch diesen jetzt zeigen:
<?php
class Buchung{
const Preis = 0;
protected $bucherName;
protected $anzahlKunden;
protected $buchungVon;
protected $buchungBis;
// Hier stehen der Tag, die Stunden und Minuten drin
protected $gebuchteZeit;
protected $gesamtPreisDerBuchung;
}
class Schiffsverleih extends Buchung{
const Preis = 20.00;
private $anzahlSchiffe = 6;
private $verfügbareBootsnummern = array("1", "2", "3", "4", "5", "6");
private $bucherBootsNummer;
public function __construct($buchername, $anzahlDerKunden, $buchungVon, $buchungBis){
$this->buchername = $buchername;
$this->anzahlKunden = $anzahlDerKunden;
$this->buchungVon = $buchungVon;
$this->buchungBis = $buchungBis;
}
public function gebuchteZeitErrechnung(){
$buchungVon = new DateTime($this->buchungVon);
$buchungBis = new DateTime($this->buchungBis);
$differenz = $buchungBis->diff($buchungVon);
$tage = $differenz->d;
$stunden = $differenz->h;
$minuten = $differenz->i;
$this->gebuchteZeit = array("tage" => $tage, "stunden" => $stunden, "minuten" => $minuten);
return $this;
}
public function preisErrechnung(){
$rechenDaten = $this->gebuchteZeit;
$minutenPreis = self::Preis / 60;
$tage = $rechenDaten["tage"];
$stunden = $rechenDaten["stunden"];
$minuten = $rechenDaten["minuten"];
$gebuchteStunden = $stunden;
if($tage > 0){
$gebuchteStunden += $tage * 24;
}
if($minuten > 0){
$minutenPreis = $minutenPreis * $minuten;
}
$this->gesamtPreisDerBuchung = round( ( ($gebuchteStunden * self::Preis) + $minutenPreis ), 2);
return $this;
}
public function setVerfuegbareSchiffe(){
$anzahlSchiffe = $this->anzahlSchiffe;
$verfuegabreSchiffsnummern = $this->verfügbareBootsnummern;
$bucherBootNummer = (4 - 1); // - 1 wegen dem Array Key
if(in_array($bucherBootNummer, $verfuegabreSchiffsnummern)){
unset($verfuegabreSchiffsnummern[$bucherBootNummer]);
$anzahlSchiffe--;
}
$this->anzahlSchiffe = $anzahlSchiffe;
$this->verfügbareBootsnummern = $verfuegabreSchiffsnummern;
return $this;
}
public function getVerfuegbareSchiffe(){
$verfuegabreSchiffe = array("anzahlSchiffe" => $this->anzahlSchiffe, "verfuegabreSchiffsnummern" => $this->verfügbareBootsnummern);
return $verfuegabreSchiffe;
}
public function getGebuchteZeit(){
return $this->gebuchteZeit;
}
public function getGesamtPreis(){
return $this->gesamtPreisDerBuchung;
}
public function getBucherName(){
return $this->buchername;
}
public function getAnzahlDerKunden(){
return $this->anzahlKunden;
}
}
$schiffsverleih = new Schiffsverleih("Tom", 2, "2018-09-15 10:30", "2018-09-18 15:00");
$buchername = $schiffsverleih->getBucherName() ?? null;
$anzahlDerKunden = $schiffsverleih->getAnzahlDerKunden() ?? null;
$verfuegbareSchiffe = $schiffsverleih->setVerfuegbareSchiffe()->getVerfuegbareSchiffe() ?? null;
$gebuchteZeit = $schiffsverleih->gebuchteZeitErrechnung()->getGebuchteZeit() ?? null;
$gesamtkosten = $schiffsverleih->preisErrechnung()->getGesamtPreis();
?>
<section>
<h4>Bucherdaten:</h4>
<ul>
<li>Buchername: <?php echo $buchername; ?></li>
<li>Anzahl der Kunden: <?php echo $anzahlDerKunden; ?></li>
<li>Gebuchte Zeit: <?php echo $gebuchteZeit["tage"] . " Tage " . $gebuchteZeit["stunden"] . " Stunden " . $gebuchteZeit["minuten"] . " Minuten"; ?></li>
<li>Gesamtkosten: <?php echo $gesamtkosten; ?> €</li>
</ul>
<h2>Geschäftsdaten: </h2>
<ul>
<li>Verfügbare Schiffe: <?php echo $verfuegbareSchiffe["anzahlSchiffe"]; ?></li>
<li>Verfügbare Schiffsnummer:
<?php
$schiffsnummern = array();
foreach($verfuegbareSchiffe["verfuegabreSchiffsnummern"] as $key){
echo $key . " ";
}
?>
</li>
</ul>
</section>
Alles anzeigen
Grüße,
Stef
Hey,
Vielen Dank für euer Feedback. Ich werde es mir heute bzw. die nächsten Tage dies genauer anschauen und diese Klasse dann optimieren und erweitern.
Wie meinst du : „Das kannst Du dann wenn die Methode Calculate() bspw. eine Referenz auf sich selbst zurückgibt“ ?
Eine Referenz ist eine zusätzliche Variable welchen eine Kopie der anderen Variable ist. Und dies erstellt man dann wenn man & vor die Variable schreibt oder eben einer variable den gleichen Wert wie in der anderen Variable zuweist.
Wie kann man es denn in OOP umsetzen?
Ich suche dann dazu auch mal.
Grüße Stef
Hey zusammen,
ich habe jetzt einen statischen Schiffsverleih programmiert und möchte nun eure Meinung zu meinem OOP-Code wissen. Kritik und Verbesserungsvorschläge sind gerne gesehen.
Der Code:
<?php
class Schiffsverleih{
const Preis = 20.00;
private $kosten;
private $anzahlBesucher;
private $anzahlSchiffe = 6;
private $bootsnummer = array("1", "2", "3", "4", "5", "6");
private $buchungVon;
private $buchungBis;
private $buchungsZeit;
private $bookedTime;
private $day;
private $hour;
private $minute;
private $bucherBootNummer;
private $buchername;
public function __construct($buchername, $anzahlBesucher, $buchungVon, $buchungBis){
if(isset($buchername, $anzahlBesucher, $buchungVon, $buchungBis)){
$this->buchername = $buchername;
$this->anzahlBesucher = $anzahlBesucher;
$this->buchungVon = $buchungVon;
$this->buchungBis = $buchungBis;
Schiffsverleih::sumBuchungszeit();
Schiffsverleih::getTimeParts();
Schiffsverleih::getBootNummer();
Schiffsverleih::getAnzahlSchiffe();
Schiffsverleih::getPrice();
}
}
protected function sumBuchungszeit(){
$von = new DateTime($this->buchungVon);
$bis = new DateTime($this->buchungBis);
$rechnung = $bis->diff($von);
$buchungsZeit = $rechnung->format('%a:%H:%i');
$this->buchungsZeit = $buchungsZeit;
}
protected function getTimeParts(){
$buchungsZeit = explode(":" , $this->buchungsZeit);
$this->day = $buchungsZeit[0];
$this->hour = $buchungsZeit[1];
$this->minute = $buchungsZeit[2];
}
protected function getBootNummer(){
$zugewieseneBootnummer = rand(1,6);
if(in_array($zugewieseneBootnummer, $this->bootsnummer)){
unset($this->bootsnummer[$zugewieseneBootnummer]);
$this->bucherBootNummer = $zugewieseneBootnummer;
}
}
protected function getAnzahlSchiffe(){
$anzahlSchiffe = count($this->bootsnummer);
$this->anzahlSchiffe = $anzahlSchiffe;
return $this->anzahlSchiffe;
}
protected function getPrice(){
$day = (int)$this->day;
$hour = (int)$this->hour;
$minute = (int)$this->minute;
$bookedhours = null;
if($day > 0){
$hour += ($day * 24);
}
if($minute > 0){
$hour .= "." . $minute;
}
$bookedhours = $hour;
$price = self::Preis * $bookedhours;
$this->kosten = $price;
$this->bookedTime = $bookedhours;
}
public function showAllData(){
$output = "<article>
<h3>Ihre Buchung bei unserem Schiffsverleih</h3>
<p>Ihre Daten:</p>
<ul>
<li>Buchername: " . $this->buchername . "</li>
<li>Anzahl der Personen: " . $this->anzahlBesucher . "</li>
<li>Mietdauer: " . $this->bookedTime . " Stunden</li>
<li>Bootnummer: " . $this->bucherBootNummer . "</li>
<li>Preis: " . $this->kosten . " €</li>
</ul>
</article>
<hr>
";
return $output;
}
}
$schiffsverleih = new Schiffsverleih("Tom", 3, "11:15", "15:50");
$schiff1 = $schiffsverleih->showAllData();
echo $schiff1;
Alles anzeigen
Grüße,
Stef
Hey fredi28,
Ja das ist möglich. Dazu brauchst du für den Anfang PHP. Dort verwertest du dann über POST bzw GET die abgesendeten Formulardaten. Bei Formularen ist POST von Vorteil.
Schau dir da das Affenformular an.
Ein gutes Tutorial dazu findest du hier: https://www.php-kurs.com/formularauswertung-mit-php.htm
Grüße,
Stef
Hey,
Ich habe eure Information bereits an den Forenadmin Axel weitergegeben. User admin ist kein Admin.
Nun müssen wir warten.
Grüße,
Stef
Hey zusammen,
mich würde es sehr interessieren welche Plugins ihr beim Editor Sublime Text 3 verwendet.
Ich hoffe auf zahlreiche Antworten.
Grüße,
Stef
Hey,
basti1012 & Arne Drews :
ich finde, dass man trotzdem aus Sicherheit die Ausgabe maskieren soll. Es kann ja vorkommen, dass ein Hacker in die Datenbank kommt und schädlichen Code platziert. Nun wenn du die Ausgabe nicht maskierst wird diese schädliche Code ausgeführt.
Die Gefahr besteht und da sichere ich dann lieber mehrmals meine Anwendung ab als das was passiert.
Grüße,
Stef
Hey Bodaggnmo,
es kann daran liegen, dass deine Seite zu groß ist. Obwohl. Eigentlich sollte es dann eingerückt werden und dadurch mehrere Seiten entstehen.
Auch würde ich dir raten nicht die Function addslashes zu verwenden. Verwende die Function htmlspecialchars um die Ausgabe zu maskieren. Diese Funktion solltest du auf alle DB-Ausgaben bis auf IDs anwenden.
Kannst du uns bitte mehr von deinem Code zeigen, damit wir es testen können ?
Vielen Dank.
Grüße,
Stef
Von Mr.Murphy :
Hallo,
ich habe auf meiner Homepage eine Karte, einen div mit background-image die Karte als Hintergrund, dann später weitere divs id city auf der Karte absoulute positioniert, so als Markup. Später dann den divs id city dem :hover effekt gegeben um beim mouseover den div id city_informationen anzuzeigen.
Also div id city und in dem div id city_informationen.
mit visibility:hidden versteckt und bei mousover :hover visible zum zeigen der Infobox zu der Stadt eingeblendet.
Jetzt möchte ich aber das es bei klick auf den div id city der innere div id city_informationen erscheint, eben die Infobox zu der Stadt.
Wie kann ich das am besten mit Javascript lösen?, muss ich komplett umstellen ? ich komme nicht weiter ...


Hey,
du hast da die einfachen Anführungszeichen zum großen Teil vergessen. Bei .bookmark-new hauptsächlich. Du siehst ja auch, dass der Code ab Zeile 4 rötlich dargestellt wird. Dies kann ein Hinweis für ein Fehler sein.
Versuche es mal so und gebe uns dann bitte Rückmeldung:
$('.delete-bookmark-new').on('click', function() {
function toggle() {
$('.bookmark-new').addClass('show-modal');
var open = $('.bookmark-new').hasClass('show-modal');
if(!(open)) {
$('.bookmark-new').addClass('show-modal');
}
}
toggle();
function thewindow(event) {
if(event.target === $('.bookmark-new')) {
$('.bookmark-new').removeClass('show-modal');
}
}
window.addEventListener('click', thewindow);
})
Alles anzeigen
Grüße,
Stef
Hey,
dies nennt man auch Responsive Webdesign. Das heißt du passt deine Webseite durch CSS-Anweisungen auch an andere Endgeräte wie dem Handy oder Tablet an.
Ich rate dir float sofort zu vergessen. Verwende dazu besser Flexbox. Mit diesem geht es viel einfacher.
Ein einfaches Beispiel: https://jsfiddle.net/4w7j293t/
Grüße,
Stef
Hey,
aso okay.
Das Problem habe ich nun gefunden. Ich habe keine Klasse namens show gehabt. Erst als ich diese erstellt habe hat alles funktioniert.
Danke!
Grüße,
Stef
HTML-Seminar.de - mit Videos zum schnellen Lernen, wie man eine Website selbst erstellt.