Problem beim einfügen einer Funktion in eine Klasse

soyyo

Grünschnabel
Hallo....

ich denke mir mal daß meine Überschrift nicht ganz das Problem beschreibt.

Ich möchte vorab bemerken daß ich keine Person bin welche eine Benotung durch Uni oder sonstiges zum Weiterkommen hier sich erschleichen möchte. Bin 46, und tuhe dieses hier rein privat.

1. Ich habe eine db bestelldatenbank mit 5 Tabellen: artikel, bestellungen, kunden, gruppen und positionen. Wobei es in meinem Vorhaben nur um das Zusammenspiel der Tabellen artikel und gruppen geht. Mein Select zum löschen von Artikel möchte nicht richtig. Ich habe dazu eine Funktion function einfuegenSelect(); welche im html code funktioniert wie sie soll, aber ich möchte sie in die class artikel einfügen. Tuhe ich dieses erhalte ich eine Fehlermeldung: Fatal error: Call to undefined function einfuegenSelect() in C:\xampp\htdocs\ysql\7\e3_artikel_loeschen.php on line 40. Also einfuegenSelect in form.
Code:
<form action="e3_artikel_loeschen.php" method="POST">
<label for="artikel">Artikel: </label>
<?php echo einfuegenSelect(); ?> <input type="submit" value="Datensatz löschen" />
</form>

Ich kann der Funktion keinen Zugriffsmodifizierer public oder sonstiges voranfügen, nicht in der html, und in der class geht ja eh nix.

Das ist die e3_artikel_loeschen.php
HTML:
<head>
    <meta http-equiv="content-type" content="text/html" />
    <meta charset="utf-8" />
    <title>Artikel löschen</title>
<?php
    require_once("artikel.class.php");
?>
<link rel="stylesheet" type="text/css" href="styles.css" />
<?php
function einfuegenSelect() { 

require_once("db.inc.php");
$sql = "SELECT anr,
                name
                FROM artikel";

if ($stmt = $mysqli -> prepare($sql)) {
        $stmt -> execute();
        $stmt -> bind_result($anr, $name);
        $s = "<select name=\"artikel\" id=\"artikel\"\>";
        while ($stmt -> fetch()) {
            $s = $s ."<option value=\"". $anr ."\"";
            $s = $s .">" .$anr ." | " .$name ."</option>";
        }
        $s = $s ."</select>";
        return $s; 
 
    $stmt->close();
    }
    $mysqli->close();
}
?>
</head>
<body>
<div class="ausgabe">
<?php
    require_once("navigation.inc.php");
?>

<?php
if (isset($_POST["artikel"])) {
    $artikel = new artikel();
    $artikel -> loeschen($_POST["artikel"]);
    echo "<h1>Artikel gelöscht!</h>";
    header("refresh:3;url=e3_artikel_loeschen.php");
}
else {
?>
<form action="e3_artikel_loeschen.php" method="POST">
<label for="artikel">Artikel: </label>
<?php echo einfuegenSelect(); ?> <input type="submit" value="Datensatz löschen" />
</form>

<?php
}
?>
</div>
</body>
Anhang anzeigen 64969 Anhang anzeigen 64970

Es gibt in der artikel.class.php ganz unten eine alternative funktion für eine Select Variante. Hab ich auch probiert....aber nada.
PHP:
class artikel {

private $tabelle = "artikel";

public function baueArtikelTabelle($sql) {
    require_once("db.inc.php");
    if($stmt = $mysqli -> prepare($sql)) {
        $stmt -> execute();
        $stmt -> bind_result($anr,
                            $gnr,
                            $name,
                            $preis);
        echo "<table id=\"zebra\">\n\t";
        echo "<caption>Tabelle Artikel</caption>\n\t";
        echo "<thead>
                <tr>
                    <th>Artikelnummer</th><th>Artikelgruppe</th><th>Artikelbezeichnung</th><th>Preis</th><th>Bearbeiten</th>
                </tr>
            </thead>";
        echo "<tbody>\n\t";
        $count = 0;
        while ($stmt -> fetch()) {
            $count += 1;
            $zebratyp = "ungerade";
            echo "<tr ";
            if($count % 2 == 0) {
                $zebratyp = "gerade";
            }
            echo "class=\"" .$zebratyp
            ."\">\n\t<td>"
            . htmlspecialchars($anr)
            ."</td>\n\t<td>"
            . htmlspecialchars($gnr)
            ."</td>\n\t<td>"
            . htmlspecialchars($name)
            ."</td>\n\t<td>"
            . htmlspecialchars($preis)
            ."</td>\n\t<td>"
            ."<a href=\"e3_artikel_loeschen.php?anr=" .htmlspecialchars($anr) ."\">bearbeiten</<a>"
            ."</td>\n</tr>";
            }
        echo "</table>";
    $stmt->close();
        }
    $mysqli->close();
    }

public function lesenAlleDaten() {
    $sql = "SELECT anr,
                   gnr,
                   name,
                   preis
                   FROM " .$this->tabelle ."
                   ORDER BY anr";
    $this->baueArtikelTabelle($sql);
    }
 
public function lesenDatensatz($id) {
    $data = array();
    require("db.inc.php");
    if($stmt = $mysqli->prepare("SELECT anr,
                                            gnr,
                                            name,
                                            preis,
                                            FROM " .$this->tabelle ."
                                            WHERE anr=?")) {
         $stmt -> bind_param('i',$id);
         $stmt -> execute();
         $ergebnis = $stmt -> get_result();
         $data = $ergebnis -> fetch_assoc();
         $ergebnis -> close();
         $stmt -> close();
         $mysqli -> close();
        }
     return($data);

    }
public function joinArtikelUndGruppen() {
    $sql = "SELECT artikel.anr,
                   gruppen.gruppe,
                   artikel.name,
                   artikel.preis
                   FROM artikel
                   JOIN gruppen ON artikel.gnr= gruppen.gnr
                   ORDER BY artikel.anr" ;
    $this->gruppiereArtikel($sql);
    }

public function gruppiereArtikel($sql) {
    require_once("db.inc.php");
    if ($stmt = $mysqli -> prepare($sql)) {
        $stmt -> execute();
        $stmt -> bind_result($anr,
                             $gruppe,
                             $name,
                             $preis);
            echo "<table id=\"zebra\">\n\t";
            echo "<caption>Tabelle Artikel Sortiert nach Gruppen</caption>\n\t";
            echo "<thead>
                <tr>
                    <th>Artikelnummer</th><th>Artikelgruppe</th><th>Artikelbezeichnung</th><th>Preis</th><th>Bearbeiten</th>
                </tr>
            </thead>";
            echo "<tbody>\n\t";
        $count = 0;
        while ($stmt -> fetch()) {
            $count += 1;
            $zebratyp = "ungerade";
            echo "<tr ";
            if($count % 2 == 0) {
                $zebratyp = "gerade";
            }
            echo "class=\"" .$zebratyp
            ."\">\n\t<td>"
            . htmlspecialchars($anr)
            ."</td>\n\t<td>"
            . htmlspecialchars($gruppe)
            ."</td>\n\t<td>"
            . htmlspecialchars($name)
            ."</td>\n\t<td>"
            . htmlspecialchars($preis)
            ."</td>\n\t<td>"
            ."<a href=\"e3_artikel_loeschen.php?anr=" .htmlspecialchars($anr) ."\">bearbeiten</<a>"
            ."</td>\n</tr>";
        }
        echo "</table>";
    $stmt->close();
    }
    $mysqli->close();
    }
/*******************************************für e3_artikel_loeschen.php****************************************************************/
/*public function einfuegenSelect() {      An dieser Stelle geht es nicht!!!

require_once("db.inc.php");
$sql = "SELECT anr,
                name
                FROM artikel";

if ($stmt = $mysqli -> prepare($sql)) {
        $stmt -> execute();
        $stmt -> bind_result($anr, $name);
        $s = "<select name=\"artikel\" id=\"artikel\"\>";
        while ($stmt -> fetch()) {
            $s = $s ."<option value=\"". $anr ."\"";
            $s = $s .">" .$anr ." | " .$name ."</option>";
        }
        $s = $s ."</select>";
        return $s; 
 
    $stmt->close();
    }
    $mysqli->close();
}*/
public function loeschen() {
    require("db.inc.php");
    $sql = "DELETE FROM " .$this -> tabelle ." WHERE anr=?";
    if($stmt = $mysqli -> prepare($sql)) {
        $stmt -> bind_param('i', $_POST["artikel"]);
        $stmt -> execute();
        }
      $stmt -> close();
      $mysqli -> close();
    }
}
/********************************************Alternative Funktion mit der ich auch nicht klar komme**********************/
/*public function einfuegenSelect($tab, $val, $text, $def) // die 1. variable für tabelle, 2. für Wert in option-element, 3. für Text in option-element und 4. für den Vorgabewert(bei einer Aktualisierung, sonst NULL)
{
    $s = "<select name=\"" .$val ."\" id=\"" .$val ."\">";
 
    require("db.inc.php");
    $sql = "SELECT " .$val .", " .$text ." FROM " .$tab;
    if ($stmt = $mysqli -> prepare($sql)) {
 
        $stmt -> execute();
        $stmt -> bind_result($val, $text);
        while ($stmt -> fetch()) {
            $s = $s ."<option value=\"". $val ."\"";
            if($val == $def){
                $s = $s ." selected";
            }
            $s = $s .">" .$val ." | " .$text ."</option>";
        }
        $s = $s ."</select>";
        return $s; 
    }
    else {
        return false;
    }
 
}*/

Das tut sie eingebettet im html der e3_artikel_loeschen.php

hier das Select mit php in html
mit-select-loeschbar.png

hier die tabelle artikel sql:
tabelle-artikel.png

hier die db bestelldatenbank:
tabelleArtikel.png

Vielen Dank für eure Aufmerksamkeit und Hilfe
 
Zuletzt bearbeitet:
Ist ein wenig Chaos von Ist-und-Funktioniert-Zustand und Fehlermeldung-Nach-Umstellung

PHP:
<form action="e3_artikel_loeschen.php" method="POST">
<label for="artikel">Artikel: </label>
<?php echo einfuegenSelect(); ?> <input type="submit" value="Datensatz löschen" />
</form>
Hier auf Zeile 3.
Wenn die Funktion in einer Klasse ist, dann brauchst du ein Objekt der Klasse, aud das du zugreiffen kannst.
PHP:
<form action="e3_artikel_loeschen.php" method="POST">
<label for="artikel">Artikel: </label>
<?php 
    myObj = New baueArtikelTabelle("SELECT * FROM XYZ");
    echo myObj->einfuegenSelect(); 
?> <input type="submit" value="Datensatz löschen" />
</form>
 
hallo.....und vielen Dank für die schnelle Antwort. Sie sind immer einer der Ersten, wenn nicht immer der Erste.

Verstehe ich das richtig. Aus meiner jetzigen:

Code:
<form action="e3_artikel_loeschen.php" method="POST">
<label for="artikel">Artikel: </label>
<?php
echo einfuegenSelect();
?> <input type="submit" value="Datensatz löschen" />
</form>

in:

Code:
form action="e3_artikel_loeschen.php" method="POST">
<label for="artikel">Artikel: </label>
<?php
    $artikel = new baueArtikelTabelle("SELECT * FROM artikel");
    echo $artikel->einfuegenSelect();
?> <input type="submit" value="Datensatz löschen" />
</form>

ich habe auch versucht ein objekt "einfuegenSelect" der class artikel zu instanzieren...hat aber nicht geklappt
wenn ich den 2.code so übernehme funzt es auch nicht. sorry
 
Was heisst "funktioniert nicht"?

Ich habe die Klasse nicht gelesen. Keine Ahnung ob sie das tun würde, was sie sollte.
Aber grundsätzlich braucht es glaub keine Direkte Hilfe sondern viel mehr den Hinweis, sich in das Programmieren mit Klassen einzulesen.
 
Versteh mich nicht falsch.
Aber ohne Fehlermeldung ist es nicht möglich zu helfen.

Zudem ist das Programmieren mit Objekte anderst als mit einfachen Code. Wenn man die Unterschiede nciht versteht, dann bringen alle Fehlersuchen etc. nix. Und ich habe das gefühl, dass du da wenig Erfahrung hast.
Natürlich könnte ich dir jetzt alles erklären. Doch es gibt viele gute Tutorials, Anleitungen etc. im Web zum Thema. Darum habe ich keine Lust, eine weitere Einführung ins Thema zu schreiben.

Falls ich mich in deiner OOP-Kenntnissen getäuscht habe, tut es mir Leid. Doch auch dann brauchen wir Zeile und Fehlermeldung....
 
Hab es geschaft....:confused:

habe mich für die funktion entschieden welche 4 parameter erwartet.....die als alternativ ganz unten im code class artikel steht...und habe dann hier und da la la la.
lange rede kurzer sinn....listo!!!

Vielen Dank für Ihre Aufmerksamkeit Herr Moderator...bis zum nächsten Notstand :D
 
Ich empfehle dir, innerhalb der Klasse Gemeinsamkeiten zu nutzen.
Deine Klasse gekürzt
PHP:
<?php
class Artikel {
    private $tabelle = "artikel";
    private $mysqli;

    public function __construct(){
        require("db.inc.php");
        $this->mysqli = $mysqli;
    }

    public function __destruct(){
        $this->mysqli->close();      
    }

    /********************************************Alternative Funktion mit der ich auch nicht klar komme**********************/
    public function einfuegenSelect($tab, $val, $text, $def) // die 1. variable für tabelle, 2. für Wert in option-element, 3. für Text in option-element und 4. für den Vorgabewert(bei einer Aktualisierung, sonst NULL)
    {
        $s = "<select name='{$val}' id='{$val}'>";
        $sql = "SELECT {$val}, {$text} FROM {$tab}";
        if ($stmt = $this->mysqli->prepare($sql)) {
            $stmt -> execute();
            $stmt -> bind_result($val, $text);
            while ($stmt -> fetch()) {
                $selected = ($val == $def) ? " selected" : "";
                $s = $s ."<option value='{$val}'{$selected}>{$val} | {$text}</option>";
            }
            $s = $s ."</select>";
            return $s;
        } else {
            return false;
        }
    
    }
}
PHP:
$artikel = new Artikel();
echo $artikel->einfuegenSelect('artikel', 'anr', 'name', 123);

Du siehst, ich habe den require() Befehl in den Konstrukteur der Klasse verschoben. Diesen kann man nachher in jeder Funktion verwendet werden.
Zudem habe ich den Klassennamen mit einem Grossbuchstaben begonnen. Viele Programmierer machen das so. So weiss man immer. Grossbuchstabe ist eine Klasse, Kleinbuchstabe ist eine Variable.
 
Hallo......

vielen Dank. Ich weiss es sehr zu schätzen, daß Sie sich meinem Thema nocheinmal angenommen haben, und Ihre Zeit dafür investiert haben.
Danke für den Hinweis mit dem Großbuchstaben. Die Methoden __construct() und __destruct() sind mir bekannt, aber Sie haben ganz recht. OOP ist für mich Neuland.

Herzlichen Dank.
 

Neue Beiträge

Zurück