Antworten auf deine Fragen:
Neues Thema erstellen

Einem Eintrag Mehrere Kategorien zu weiseen

L

Lukas1468

Guest

Wie diese funktionieren ist mit klar ich weis nur nicht wie ich diese hier einfüge und umsetzte

Gruß Lukas
 

Duddle

Posting-Frequenz: 14µHz

Die Kategorien werden noch nicht übergeben
Hast du dir $_POST['cat'] ausgeben lassen um zu bestätigen, dass die Kategorien nicht übertragen werden? Wenn nein, mach das. Wenn ja ist irgendwas anderes kaputt (weil das was ich bzgl. diesem Schritt sehe korrekt ist).
und in der Beitrag-Kategorie-Tabelle eingetragen
Weil dein Code das nicht aussagt. Computer sind dumm, sie folgen exakt deinen Anweisungen.
Dein Code sagt "trage mir das Array ein". PHP wandelt das Array um, weil du es wie einen String behandelst. Ein Array ist aber kein String, also bekommst du einen Fehler.
ich bekomme das Array der Checkboxen nicht in die Eintragenfunktion
Wie vorher schon gesagt:
Entweder musst du also in cat_cont() durch das Array gehen oder in deinem letzten else-Zweig vom Eintragen-Code.
Du kennst (lt. Eigenaussage) Arrays und foreach, du solltest also keinerlei Probleme mit der Umsetzung meines Vorschlages haben.
die ID des Beitrages wird ebenfalls nicht in die Beitrag-Kategorie-Tabelle eingetragen
Dann sagt dein Code das nicht aus. Du hast für diesen Anwendungsfall noch keinen Code gepostet, also kann ich auch keine weiteren Lösungen vorschlagen. Für das genannte Problem mit ID = 0 habe ich mehrere Ansätze umrissen.


Duddle
 
L

Lukas1468

Guest

Für die Eintrag ID wollte ich die Autoincremnt ID des Beitrages verwenden der dafür war ja das PDO::LastinserId das funktioniert aber aus irgendeinem Grund nicht.

Gruß Lukas
 

Duddle

Posting-Frequenz: 14µHz

Für das genannte Problem mit ID = 0 habe ich mehrere Ansätze umrissen.

Dein Code zeigt zu wenig um die Fehlerquelle eingrenzen zu können. Arbeitest du mit MySQL? Benutzt du Transaktionen? Falls ja, musst du lastInsertId abfragen bevor du den Commit durchführst.
Falls du eine Klasse benutzt und die automatisch für dich nach jedem Query commitet, könntest du (abhängig vom DBMS) bspw. bei MySQL LAST_INSERT_ID() anfragen, obwohl das in Ausnahmefällen zu Fehlern führen könnte.


Duddle
 
L

Lukas1468

Guest

Wie sähe denn in diesem Beispiel die Foreach aus ich habe grade keine Ahnung wie ich diese bilde.

bekomme diesen Fehler:
Notice: Undefined index: cat in C:\xampp\htdocs\SWB\getin.php on line 19

PHP:
$id_beitrag = $DB_con->lastInsertId();
$cat = $_POST['cat'];
elseif($cat){
            foreach($cat as $id_kateg) {
                $id_kateg = implode(',', $cat);
            }
        }

if($quer->cat_cont($id_beitrag, $id_kateg) {
header(Location:getin.php?=true);
}

Gruß Lukas
 

Duddle

Posting-Frequenz: 14µHz

Da ist einiges falsch.
Du möchtest (bspw.) 3 Einträge in einer Tabelle einfügen. Du hast eine Funktion (cant_cont()), die pro Aufruf einen Eintrag in diese Tabelle einfügen kann. Schlussfolgernd musst du diese Funktion 3 mal aufrufen. Also:
PHP:
foreach($cat as $id_kateg) {
$quer->cat_cont($id_beitrag, $id_kateg);
}

Wenn du
Undefined index: cat
bekommst, wurde cat nicht im POST-Array übermittelt. Das musst du natürlich garantieren bzw. fehlerbehandeln.

Der Rest vom Code sieht wild zusammengewürfelt aus. Entweder kopierst du ihn nicht richtig oder du verschweigst größere Bestandteile, was das Debugging schwieriger macht.


Duddle
 
L

Lukas1468

Guest

meine POST Abfrage ist doch trotzdem $cat= $_POST['cat'] wenn der Name name=cat[] ist oder ?
$DB_con ist eine Datenbankverbindungsvariable.
PHP:
public function query_check() {
            $stmt = $this->db->query("SELECT * FROM category");
            foreach($stmt as $row) {
                echo "<form action='' method='post'>";
                echo "<p><input type='checkbox' name='cat[]' value='".$row['cat_id']."'>".$row['cat_rowname']."</p>";
                echo "</form>";
            }
        }

Gruß Lukas
 
Zuletzt bearbeitet von einem Moderator:

Duddle

Posting-Frequenz: 14µHz

Korrekt.
Aber $_POST['cat'] existiert nur, wenn mindestens eine der Checkboxen angeklickt wurde. Also musst du prüfen, ob das Array existiert bevor du es verwendest.


Duddle
 
L

Lukas1468

Guest

Ich nutzte MYSQL. Weis gerade nur nicht wie ich die lastinsetid() aus der Tabelle Beitrag in die Tabelle Beitrag-Kategorie einfüge.

Gruß Lukas
 

Duddle

Posting-Frequenz: 14µHz

Bekommst du die korrekte letzte ID? Wenn ja, hast du schon den korrekten Code. Wenn nein, kann ich mich nur (erneut) wiederholen:
Benutzt du Transaktionen? Falls ja, musst du lastInsertId abfragen bevor du den Commit durchführst.
Falls du eine Klasse benutzt und die automatisch für dich nach jedem Query commitet, könntest du (abhängig vom DBMS) bspw. bei MySQL LAST_INSERT_ID() anfragen, obwohl das in Ausnahmefällen zu Fehlern führen könnte.


Duddle
 
L

Lukas1468

Guest

Ich bin mit diesem Comment etwas überfordert. Ich bekomme die ID=0, gibt es eine andere Möglichkeit dies zu erreichen ?
 
Zuletzt bearbeitet von einem Moderator:
L

Lukas1468

Guest

Der var_dump gibt:
PHP:
 die(var_dump($DB_con->lastInsertId()));
Code:
tring(1) "0"
Es kommt folgende Fehlermeldung, es wird keine ID mit an die Tabelle übergeben.
Code:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSET INTO catgorie_content(id_beitrag, id_kateg) VALUES ('0', '1')' at line 1

Die abfrage zu Lastinsertd() läuft über das eintragen script und wird mit als Parametervariable in die Eintragenfunktion mit übergeben wo der Eintrag dann in die Tabelle Beitrag und in die tabelle Eintrag_Kategorie eingetragen wird.

Gruß Lukas
 

Duddle

Posting-Frequenz: 14µHz

Ich habe zu 100% verstanden, dass du eine 0 bekommst. Wirklich. Seit diesem Kommentar.
Ich verstehe auch, dass das zu Folgefehlern führt und warum es zu diesen Fehlern kommt.

Deshalb habe ich in diesem Kommentar zwei Lösungsvorschläge für dieses Problem angegeben. Ich habe diese in diesem Kommentar nochmal zitiert. Und in diesem.

Ich habe dein Problem verstanden. Ich habe Lösungsvorschläge für das Problem gezeigt. Ich habe diese (zumindest einen davon) verlinkt. Wenn du aber die Lösungsvorschläge nicht anwendest, wird das Problem nicht gelöst.


Duddle
 
L

Lukas1468

Guest

PHP:
 public function cat_cont($id_kateg) {
            try {
                $cat_cont = $this->db->prepare("INSET INTO catgorie_content(id_beitrag, id_kateg) VALUES (:id_beitrag, :id_kateg)");
               
                $cat_cont->bindparam(":id_beitrag", $id_beitrag);
                $cat_cont->bindparam(":id_kateg", $id_kateg);
                $id_beitrag = $this->db->lastInsertId();
                $cat_cont->execute();
               
                return $cat_cont;
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
        }

Ich habe mir nun das MySQL Manual durchgelesen trotzdem bekomme ich die lastinsertid(); immer auf 0 gesetzt.

Wie kann ich das anhand diesem beispiel lösen, oder stimmt etwas ander SQL prepare nicht ?

Gruß Lukas
 

Duddle

Posting-Frequenz: 14µHz

Dann vergiss lastInsertId(). Benutz LAST_INSERT_ID(), vielleicht kannst du damit besser umgehen.
Füg deinen Beitrag ein, frag die Datenbank danach per Query nach LAST_INSERT_ID() und speicher den Wert in einer Variable.

Edit:
Ich sehe gerade erst, dass du die Variable $id_beitrag benutzt bevor du sie zuweist. Das funktioniert natürlich nicht.
Der Ablauf sind zwei voneinander unabhängige Schritte. Zuerst fügst du einen Beitrag in die Beitrags-Tabelle ein. Unmittelbar danach (aber erst wenn der Beitrag in der Beitrags-Tabelle steht) holst du dir per PHPs lastInsertId() oder MySQLs LAST_INSERT_ID() die letzte ID. Diese übergibst du dann an cat_cont().


Duddle
 
Zuletzt bearbeitet:
L

Lukas1468

Guest

Das Formular ist ein Selbstverweis.
Die Funktion cat_cont() erwartet zwei Variablen, Die Variable id_kateg soll sofort in der isset abfrage übergeben werden . Die Variable $id_beitrag soll nach der isser abfrage übergeben werden wie kann ich dies erreichen ? und wie kann ich dann die Seite neu laden so dass die Funktion trotzdem noch durchgeführt wird.

Code:
PHP:
<?php
    require_once 'config/dbconfig.php';
    session_start();
    if(!$user->is_loggedin()!="") {
        $user->redirect('login.php');
    }
   
    $uname = $_SESSION['user_name'];
    $stmt = $DB_con->prepare("SELECT * FROM users WHERE user_name=:uname");
    $stmt->execute(array(":uname"=>$uname));
    $userRow = $stmt->fetch(PDO::FETCH_ASSOC);
   
    if(isset($_POST["eintragen"])) {
        $betreff = trim($_POST['betreff']);
        $content = trim($_POST['content']);
        $c_mail = trim($_POST['c_mail']);
        $s_name = $_SESSION['user_name'];
        $cat = $_POST['cat'];
       
        if($betreff == "") {
            $error[] = "Bitte geben Sie einen Betreff ein !"; 
        }
       
        elseif($content == "") {
            $error[] = "Bitte füllen sie den Textberech aus !";
        }
       
        elseif($c_mail == "") {
            $error[] = "Bitte geben Sie eine Kontakt Email Adresse ein";
        }
        elseif(!filter_var($c_mail, FILTER_VALIDATE_EMAIL)) {
            $error[] = "Bitte geben Sie eine verfügbare E-Mail Adresse ein !";
        }
        elseif(strlen($betreff) < 10) {
            $error[] = "Der Betreff muss mindestens 10 Zeichen haben !";
        }
       
        elseif(strlen($content) < 50) {
            $error[] = "Das Textfeld muss mindestens 50 Zeichen haben ";
        }
       
        elseif((count($cat) > 3)) { 
            $error[] = "Bitte nur maximal 3 Kategorien auswähl"; 
        }
       
        elseif((count($cat) == 0)) {
            $error[] = "Bitte wählen sie eine Kategorie aus";
        }
        elseif ($cat) {
            foreach($cat as $id_kateg) {
               
                //$query->cat_cont($id_kateg);
           }
        }
        else {
            if($query->beitrag($betreff, $content, $s_name, $c_mail)) {
                $user->redirect('getin.php?=true');
               
            }
            //$user->redirect('getin.php?=true');
        }
    }
    $query->cat_cont($id_beitrag, $id_kateg);
    $id_beitrag = $DB_con->lastInsertId();
//die(var_dump($DB_con->lastInsertId()));
   
?>
<!DOCTYPE html>
<html lang="de">
    <head>
        <meta charset="utf-8">
        <title>Schwarzes-Web-Brett</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="icon" type="image/ico" href="img/cuw.ico">
        <link href="css/bootstrap.min.css" rel="stylesheet">
        <link rel="stylesheet" href="css/style.css" type="text/css">
    </head>
    <body>
        <div class="container">
            <nav class="navbar navbar-inverse navbar-fixed-top">
                <div class="container">
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                            <span class="sr-only">Navigation ein-/ausblenden</span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                        </button>
                        <a class="navbar-brand" href="index.php">Schwarzes Web-Brett</a>
                    </div>
                    <div id="navbar" class="collapse navbar-collapse">
                        <ul class="nav navbar-nav">
                            <li><a href="index.php">Start</a></li>
                            <li class="active"><a href="">Anzeige Aufgeben</a></li>
                        </ul>
                        <ul class="nav navbar-nav navbar-right">
                            <li class="dropdown">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                                    <?php error_reporting(0); echo $uname; ?> 
                                    <span class="caret"></span></a>
                                <ul class="dropdown-menu">
                                    <li><a href="dashboard.php">Dashboard</a></li>
                                    <li><a href="profil.php">Profil</a></li>
                                    <li><a href="login.php">Anmelden</a></li>
                                    <li role="separator" class="divider"></li>
                                    <li><a href="logout.php?logout=true">Abmelden</a></li>
                                </ul>
                            </li>
                        </ul>
                    </div>
                </div>
            </nav>
        </div>
        <div class="container">
            <div class="row clearfix">
                <div class="page-header">
                    <h1 align="center">Neuen Eintrag anlegen</h1>
                </div>
                <br>
                <div class="col-md-6">
                    <?php
                        if(isset($error)) {
                            foreach($error as $error) {
                                echo "<div class='alert alert-danger'>";
                                echo "<i class='glyphicon glyphicon-warning-sign'></i> $error";
                                echo "</div>";
                            }
                        }
                        elseif(isset($_GET['true'])) {
                            echo "<div class='alert alert-success'>";
                            echo "<i class='glyphicon glyphicon-ok-sign'></i> &nbsp; Dein Eintrag wurde erstellt <a href='index.php'>hier </a>einsehen";
                            echo "</div>";
                        }
                    ?>
                    <h4>Bitte füllen Sie das gesamte Formular aus !</h4>
                    <form class="form-horizontal" action="" method="post">
                        <div class="form-group">
                            <label for="inputbetreff" class="col-sm-2 controll-label"></label>
                            <input name="betreff" class="form-control" id="inputbetreff" maxlength="60" placeholder="Betreff min. 10 Zeichen max. 60 Zeichen">
                            <label for="uname" class="col-sm-2 controll-label"></label>
                            <input name="uname" class="form-control" id="uname" maxlength="40" placeholder=Nickname:<?php echo "&nbsp;$uname"; ?> disabled>
                            <label for="c_mail" class="col-sm-2 controll-label"></label>
                            <input name="c_mail" class="form-control" id="c_mail" maxlength="40" placeholder="Kontakt Email-Adresse">
                            <label for="inputtext" class="col-sm-2 controll-label"></label>
                            <textarea cols="50" rows="10" name="content" class="form-control" id="inputtext" maxlength="255" placeholder="Texteingabe min. 50 Zeichen max. 255 Zeichen"></textarea>
                            <br/>
                            <button class="btn btn-success btn-block" name="eintragen" type="submit">Neuer Eintrag</button>
                            <button class="btn btn-danger btn-block" type="submit">Löschen</button>
                            <br/>
                        </div>
                </div>
                <div class="col-md-4 col-md-offset-2">
                    <h4>Nur maximal drei Kategorien auswählen!</h4>
                    <br/>
                    <?php
                        $getout->query_check();
                    ?>
                </form>
                </div>
            </div>
        </div>
        <footer class="navbar navbar-inverse navbar-fixed-bottom">
            <div class="container">
                <p class="text-muted">Schwarzes-Web-Brett</p>
            </div>
        </footer>
        <script type="text/javascript" src="js/jquery.min.js"></script>
        <script type="text/javascript" src="js/bootstrap.min.js"></script>
        <script type="text/javascript" src="js/scripts.js"></script>
    </body>
</html>

Noch einmal die Funktion cat_cont(); :
PHP:
 public function cat_cont($id_kateg, $id_beitrag) {
            try {
                $cat_cont = $this->db->prepare("INSET INTO catgorie_content(id_beitrag, id_kateg) VALUES (:id_beitrag, :id_kateg)");
               
                $cat_cont->bindparam(":id_beitrag", $id_beitrag);
                $cat_cont->bindparam(":id_kateg", $id_kateg);
               
                $cat_cont->execute();
               
                return $cat_cont;
            } catch (PDOException $e) {
                echo $e->getMessage();
                die();
            }
        }
Gruß
Lukas
 

Duddle

Posting-Frequenz: 14µHz

Okay, wir haben uns glaube ich lange genug damit rumgeschlagen und du scheinst auch mit vielen Stupsern nicht weiter zu kommen, daher zerlege ich es nochmal:
PHP:
elseif ($cat) {
    foreach($cat as $id_kateg) {
      
    //$query->cat_cont($id_kateg);
   }
}
else {
    if($query->beitrag($betreff, $content, $s_name, $c_mail)) {
    $user->redirect('getin.php?=true');
      
    }
    //$user->redirect('getin.php?=true');
}
Diese Logik ergibt so keinen Sinn, zumindest nicht den gewünschten. Du behandelst zuerst die Kategorien und dann den Eintrag, obwohl du (wie mehrfach erwähnt) erst den Eintrag und dann die Kategorien behandeln musst.
Die Zeilen 64 und 65 verstehe ich mal als Fragmente deiner Tests und ignoriere sie.

Da du zuerst den Eintrag behandeln musst, muss das umgedreht werden. Da ein Eintrag in der Beitrag-Kategorie-Tabelle auch nur Sinn ergibt, wenn du auch einen Eintrag geschrieben hast, kann das gleich verbunden werden.
PHP:
else {
    if($query->beitrag($betreff, $content, $s_name, $c_mail)) {
    $user->redirect('getin.php?=true');
    }
    foreach($cat as $id_kateg) {
    $query->cat_cont($id_beitrag, $id_kateg);
    }
}
Jetzt würde aber der Redirect stattfinden, bevor die Einträge in der Beitrag-Kategorie-Tabelle passiert sind. Also muss das korrekt ausgedrückt so aussehen:
PHP:
else {
    if($query->beitrag($betreff, $content, $s_name, $c_mail)) {
    foreach($cat as $id_kateg) {
        $query->cat_cont($id_beitrag, $id_kateg);
    }

    $user->redirect('getin.php?=true');
    }
}
Jetzt fehlt aber immer noch $id_beitrag. Da zum Zeitpunkt des foreach aber schon klar ist, dass ein Beitrag geschrieben wurde, muss die letzte ID geholt werden. Ich werde (ungetestet) mal annehmen, dass folgendes funktioniert:
PHP:
else {
    if($query->beitrag($betreff, $content, $s_name, $c_mail)) {

    $stmt = $DB_con->prepare("SELECT LAST_INSERT_ID() as letzteid");
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $id_beitrag = $row["letzteid"];

    foreach($cat as $id_kateg) {
        $query->cat_cont($id_beitrag, $id_kateg);
    }

    $user->redirect('getin.php?=true');
    }
}
(du benutzt übrigens nie $userRow in deinem gezeigten Code, obwohl du es holst)

Jetzt fehlt natürlich noch eine Fehlerbehandlung. Zum Beispiel könnte ja $cat leer sein. In dem Fall brauchen wir auch nicht den Spaß mit der letzten ID, also klammere ich es mal so. Du kannst es auch auf das foreach beschränken:
PHP:
else {
    if($query->beitrag($betreff, $content, $s_name, $c_mail)) {

    if($cat) {
        $stmt = $DB_con->prepare("SELECT LAST_INSERT_ID() as letzteid");
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        $id_beitrag = $row["letzteid"];

        foreach($cat as $id_kateg) {
        $query->cat_cont($id_beitrag, $id_kateg);
        }
    }

    $user->redirect('getin.php?=true');
    }
}
Offensichtlich fehlt noch eine Fehlerbehandlung für $id_beitrag, aber das bekommst du vielleicht auch selbst hin.

Das sollte so weit funktionieren. Möglicherweise musst du noch die Namen der Variablen anpassen, ich weiß nicht genau was $query und $DB_con unterscheidet.


Duddle
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.564
Beiträge
1.538.064
Mitglieder
67.487
Neuestes Mitglied
MichaelSEivy
Oben