• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Warning: mysqli::prepare(): Couldn't fetch mysqli in ...

Bourbon

Mitglied
Hallo Leute,

ich muss euch abermals belästigen, da Ich hier ein Problem mit einer sehr einfach Ausgabe habe:

Aufgabe: Zeige die Titel aller Notizen mit der "group_ID" = X

PHP:
<!DOCTYPE html>
<html>
<head></head>
<body>

<?php
require_once "db_daten.php";
$group_ID = $_GET['group_ID'];
$suche = $group_ID;
if($stmt = $mysqli->prepare(
          "SELECT
            notice.notice_ID,
            notice.titel
           FROM
            notice
           WHERE
            notice.group_ID LIKE ?
            ")) {
  $stmt->bind_param("s",  $suche);
  $stmt->execute();
  $stmt->bind_result($notice_ID, $titel);
  echo "<table border='1'>\n";
  while($stmt->fetch()) {
    echo "<tr>\n\t<td><a href='db_gruppeninfo.php?group_ID=".$group_ID."'>"
       . htmlspecialchars($notice)
       . "</td>\n</tr>\n";
    }
  $stmt->close();
}
$mysqli->close();
?>

</body>
</html>

Aber leider kommt immer der Fehler:
Warning: mysqli::prepare(): Couldn't fetch mysqli inC:\xampp\htdocs\php-beispiele\Website Aufbau und Design\db_notice.php on line 18

Warning: mysqli::close(): Couldn't fetch mysqli inC:\xampp\htdocs\php-beispiele\Website Aufbau und Design\db_notice.php on line 30
 
Zuletzt bearbeitet:
Werbung:
Hallo Leute,

ich muss euch abermals belästigen, da Ich hier ein Problem mit einer sehr einfach Ausgabe habe:

Aufgabe: Zeige die Titel aller Notizen mit der "group_ID" = X

PHP:
<!DOCTYPE html>
<html>
<head></head>
<body>

<?php
require_once "db_daten.php";
$group_ID = $_GET['group_ID'];
$suche = $group_ID;
if($stmt = $mysqli->prepare(
          "SELECT
            notice.notice_ID,
            notice.titel
           FROM
            notice
           WHERE
            notice.group_ID LIKE ?
            ")) {
  $stmt->bind_param("s",  $suche);
  $stmt->execute();
  $stmt->bind_result($notice_ID, $titel);
  echo "<table border='1'>\n";
  while($stmt->fetch()) {
    echo "<tr>\n\t<td><a href='db_gruppeninfo.php?group_ID=".$group_ID."'>"
       . htmlspecialchars($notice)
       . "</td>\n</tr>\n";
    }
  $stmt->close();
}
$mysqli->close();
?>

</body>
</html>

Aber leider kommt immer der Fehler:
Warning: mysqli::prepare(): Couldn't fetch mysqli inC:\xampp\htdocs\php-beispiele\Website Aufbau und Design\db_notice.php on line 18

Warning: mysqli::close(): Couldn't fetch mysqli inC:\xampp\htdocs\php-beispiele\Website Aufbau und Design\db_notice.php on line 30

Ist das der vollständige Code?
Was steht in db_daten?
 
Ja, das ist der gesamte Code.
Dennoch funktioniert es nicht. An anderer Stelle (du kannst dich vll noch an meiner anderen Threads erinnern) funktioniert es genauso und die berufen sich auch alle nur auf die db_daten.

Hier der Code der db_daten:
Code:
<?php
$mysqli = new mysqli("localhost", "BENUTZER", "PASSWORT", "DBNAME");
if ($mysqli->connect_error) {
  echo "Fehler bei der Verbindung: " . mysqli_connect_error();
  exit();
}
if (!$mysqli->set_charset("utf8")) {
  echo "Fehler beim Laden von UTF8 ". $mysqli->error;
}
?>

Ich habe jetzt schon mehrere Varianten ausprobiert.
Mittels echo $group_ID; lasse ich mir die weitergebene ID ausgeben und die stimmt auch immer. Dennoch erscheint immer der Fehler, wenn ich mir die Daten ausgeben lassen will (Ausgabe erfolgt über db_gruppeninfo.php mittels include).

Gebe ich der group_ID der Notice.php im Code eine feste ID vor ($group_ID = "1"), funktioniert es wiederum....
 
Werbung:
Gebe ich der group_ID der Notice.php im Code eine feste ID vor ($group_ID = "1"), funktioniert es wiederum....

Könnte es sein, dass der GET-Parameter anders geschrieben wird? Nicht group_ID sondern group_id oder so? Wäre ein Unterschied und würde bei diesem Aufbau deiner Programmierung zu einem Fehler führen.
 
Könnte es sein, dass der GET-Parameter anders geschrieben wird? Nicht group_ID sondern group_id oder so? Wäre ein Unterschied und würde bei diesem Aufbau deiner Programmierung zu einem Fehler führen.
Nein, daran lag es leider nicht. Der GET-Parameter ist überall gleich geschrieben, auch in der Datenbank.

//EDIT
Gebe ich aber die group_ID als 1 vor, erscheint der Fehler hier:

Notice: Undefined index: group_ID in C:\xampp\htdocs\php-beispiele\Website Aufbau und Design\db_notice.php on line 12

PHP:
<!DOCTYPE html>
<html>
<head>
  <link href="styles/styles.css" rel="stylesheet" type="text/css" />
  <title>Vorbereitete Anweisung: SELECT</title>
  <meta charset="UTF-8" />
</head>
<body>

<?php
require_once "db_daten.php";
$group_ID = $_GET['group_ID'];

Rufe ich die Datei aber regulär über den Link auf, wird die group_ID weitergegeben (sehe ich, weil ich sie mir mit echo ausgeben lassen).
 
Zuletzt bearbeitet:
Werbung:
Bedeutet wie beim letzten mal auch, dass 'group_ID' in $_GET nicht existiert:
http://www.html.de/threads/onchange...-selectedindex-value.53209/page-2#post-363334

So, jetzt verstehe ich, wo das Problem liegt.

Die Notice.php ist mittels include in die db_gruppeninfo.php eingebunden.
Code:
<?php include('db_notice.php');
?>
Und dann passiert genau das, was "scbawik" geschrieben hat. Es wird zwar die Datei aufgerufen, aber die group_ID wird nicht an die db_notice.php weitergegeben, wodurch ja der Fehler entsteht.

Wie gebe ich aber die group_ID mittels include weiter?

//NACHTRAG
Oder ist das jetzt hier ein Fall für Sessions?
 
Zuletzt bearbeitet:
Und warum funktioniert das dann nicht? Das ist der Punkt, den ich noch nicht verstehe, weil es woanders funktioniert.
 
Werbung:
Dann musst Du das mal mittels var_dump() oder Analyse deiner Programmierung sowie der PHP-Einstellungen deines Servers debuggen. Das kann dir niemand abnehmen da wir keinen Zugriff auf deinen Server und deine Dateien haben.
 
Nur um nochmal sicher zu gehen:

Hier der komplette Code der "db_gruppeninfo.php" mit include(db_notice.php):
PHP:
<!DOCTYPE html>
<html>
<head>
  <link href="styles/styles.css" rel="stylesheet" type="text/css" />
  <title>Vorbereitete Anweisung: SELECT</title>
  <meta charset="UTF-8" />
</head>
<body>

<div class='rahmen'>

<header>
  <ul id='headerleiste'>
    <li id='header_links'><input type="button" value="zurück" onclick="window.location.href='db_gruppen.php'" /></li>
    <li id='header_mitte'>Gruppendetails</li>
    <li id='header_rechts'><a href="db_insert.php?group_ID=<?php echo $_GET['group_ID'] ?>"><button> + </button></a></li>
  </ul>     
</header>
<hr>

<div class='main'>            <!--div['main' wird geöffnet]-->
  <div class='content'>

                              <!--Ausgabe Gruppeninformation-->
<?php
require_once "db_daten.php";
$group_ID = $_GET['group_ID'];
$_SESSION['group_ID'] = $group_ID;
$suche = $group_ID;
if($stmt = $mysqli->prepare(
          "SELECT
            groups.description
           FROM
            groups
                 WHERE
            groups.group_ID LIKE ?
            ")) {
  $stmt->bind_param("i",  $suche);
  $stmt->execute();
  $stmt->bind_result($description);
  echo "<table border='1'>\n";
  while($stmt->fetch()) {
    echo "<tr>\n\t<td>Beschreibung</td><td>"
       . htmlspecialchars($description)
       . "</td>\n</tr>\n";
    }
  $stmt->close();
}
$mysqli->close();
?>
</table>

<br>
<br>                          <!--Ausgabe Notizen pro Gruppe-->
<?php
$group_ID = $_GET['group_ID'];
include('db_notice.php');
?>


</div>
</div>                  <!--div['main' wird geschlossen]-->

<?php include('footer.php');
?>

</body>
</html>

Und hier der Code der "db_notice.php":
PHP:
<!DOCTYPE html>
<html>
<head>
  <link href="styles/styles.css" rel="stylesheet" type="text/css" />
  <title>Vorbereitete Anweisung: SELECT</title>
  <meta charset="UTF-8" />
</head>
<body>
                              <!--Ausgabe Gruppeninformation-->
<?php
require_once "db_daten.php";
$group_ID = $_SESSION['group_ID'];
$suche = $group_ID;
if($stmt = $mysqli->prepare(
          "SELECT
            notice.titel,
            notice.notice
           FROM
            notice
                 WHERE
            notice.group_ID LIKE ?
            ")) {
  $stmt->bind_param("i",  $suche);
  $stmt->execute();
  $stmt->bind_result($titel, $notice);
  echo "<table border='1'>\n";
  while($stmt->fetch()) {
   echo "<tr>\n\t<td>Titel</td><td>"
       . htmlspecialchars($titel)
       . "</td><tr></tr><td>Notiz</td><td>"
       . htmlspecialchars($notice)
       . "</td>\n</tr>\n";
    }
  $stmt->close();
}
$mysqli->close();
echo $group_ID;
?>
</table>
</body>
</html>
Also an der "group_ID" kann es nicht liegen, wie man sieht, lass ich die am Ende ausgeben und die stimmt immer.

Jetzt nochmal der Fehler:
Code:
Warning: mysqli::prepare(): Couldn't fetch mysqli in C:\xampp\htdocs\php-beispiele\Website Testdateien\db_notice.php on line 22

Warning: mysqli::close(): Couldn't fetch mysqli in C:\xampp\htdocs\php-beispiele\Website Testdateien\db_notice.php on line 36

Gebe ich den Code hier direkt in PHPmyAdmin ein:
PHP:
SELECT
            notice.titel,
            notice.notice
           FROM
            notice
                 WHERE
            notice.group_ID LIKE 3
zeigt es mir das gewünschte Ergebnis.
Es steht aber auch eine Warnung da:
Die aktuelle Markierung enthält keine eindeutige ("unique") Spalte. Gitter-Bearbeitungsfunktion, Kontrollkästchen, Bearbeiten, Kopieren und Löschen von Links sind nicht verfügbar.
 
Zuletzt bearbeitet:
Die Fehlermeldungen in Bezug auf mysqli haben mit dem mysqli-Objekt zu tun. Laut Handbuch, wo auch diese Fehlermeldung beschrieben wird, kann das mehrere Ursachen haben:
* Die Datenbankverbindung wurde bereits wieder geschlossen.
* Das Datenbankverbindungsobjekt ist unserialized.
* Du wendest OOP nicht korrekt.

Siehe: http://php.net/manual/de/mysqli.query.php

Da Du uns die db_daten.php vorenthalten hast, kann man das weiterhin nicht genauer beurteilen. Du kannst das selbst wie gesagt mittels var_dump() auf die entsprechenden Variablen prüfen.

Unabhängig davon ist der Aufbau deiner PHP-Dateien etwas merkwürdig. Du brauchst die db_daten.php z.B. nicht mehrmals einbinden. Ein Mal reicht völlig, da es eine zentrale Funktion ist möglichst weit oben.
 
Werbung:
db_daten.php (hab ich vergessen, sry)

PHP:
<?php
$mysqli = new mysqli("localhost", "root", "geheim", "whatever");
if ($mysqli->connect_error) {
  echo "Fehler bei der Verbindung: " . mysqli_connect_error();
  exit();
}
if (!$mysqli->set_charset("utf8")) {
  echo "Fehler beim Laden von UTF8 ". $mysqli->error;
}
?>

<?php
session_start();
?>
 
Und was sagt dein Ergebnis zur Prüfung, ob $mysqli an der Stelle, an der Du es nutzen möchtest noch korrekt gesetzt ist?
 
Da kam ich gerade noch nicht dazu, wollte nur schnell mal den Code der Vollständigkeit halber nachwerfen. Werde mich entweder heute Abend oder erst morgen nochmal daran setzen! Aber vielen Dank schon mal für deine Hilfe!
 
Werbung:
Hi,

was du da vor hast, ist total ineffizient & fehlerhaft.

Dein Code sieht im Endeffekt so aus:
PHP:
<!DOCTYPE html>
<html>
<head>
  <link href="styles/styles.css" rel="stylesheet" type="text/css" />
  <title>Vorbereitete Anweisung: SELECT</title>
  <meta charset="UTF-8" />
</head>
<body>
<div class='rahmen'>
<header>
  <ul id='headerleiste'>
  <li id='header_links'><input type="button" value="zurück" onclick="window.location.href='db_gruppen.php'" /></li>
  <li id='header_mitte'>Gruppendetails</li>
  <li id='header_rechts'><a href="db_insert.php?group_ID=<?php echo $_GET['group_ID'] ?>"><button> + </button></a></li>
  </ul>  
</header>
<hr>
<div class='main'>  <!--div['main' wird geöffnet]-->
  <div class='content'>
  <!--Ausgabe Gruppeninformation-->
<?php
$mysqli = new mysqli("localhost", "root", "geheim", "whatever");
if ($mysqli->connect_error) {
  echo "Fehler bei der Verbindung: " . mysqli_connect_error();
  exit();
}
if (!$mysqli->set_charset("utf8")) {
  echo "Fehler beim Laden von UTF8 ". $mysqli->error;
}

session_start();


$group_ID = $_GET['group_ID'];
$_SESSION['group_ID'] = $group_ID;
$suche = $group_ID;
if($stmt = $mysqli->prepare(
  "SELECT
  groups.description
  FROM
  groups
  WHERE
  groups.group_ID LIKE ?
  ")) {
  $stmt->bind_param("i",  $suche);
  $stmt->execute();
  $stmt->bind_result($description);
  echo "<table border='1'>\n";
  while($stmt->fetch()) {
  echo "<tr>\n\t<td>Beschreibung</td><td>"
  . htmlspecialchars($description)
  . "</td>\n</tr>\n";
  }
  $stmt->close();
}
$mysqli->close();
?>
</table>
<br>
<br>  <!--Ausgabe Notizen pro Gruppe-->
<?php
$group_ID = $_GET['group_ID'];
?>
<!DOCTYPE html>
<html>
<head>
  <link href="styles/styles.css" rel="stylesheet" type="text/css" />
  <title>Vorbereitete Anweisung: SELECT</title>
  <meta charset="UTF-8" />
</head>
<body>
  <!--Ausgabe Gruppeninformation-->
<?php
$mysqli = new mysqli("localhost", "root", "geheim", "whatever");
if ($mysqli->connect_error) {
  echo "Fehler bei der Verbindung: " . mysqli_connect_error();
  exit();
}
if (!$mysqli->set_charset("utf8")) {
  echo "Fehler beim Laden von UTF8 ". $mysqli->error;
}

session_start();

$group_ID = $_SESSION['group_ID'];
$suche = $group_ID;
if($stmt = $mysqli->prepare(
  "SELECT
  notice.titel,
  notice.notice
  FROM
  notice
  WHERE
  notice.group_ID LIKE ?
  ")) {
  $stmt->bind_param("i",  $suche);
  $stmt->execute();
  $stmt->bind_result($titel, $notice);
  echo "<table border='1'>\n";
  while($stmt->fetch()) {
  echo "<tr>\n\t<td>Titel</td><td>"
  . htmlspecialchars($titel)
  . "</td><tr></tr><td>Notiz</td><td>"
  . htmlspecialchars($notice)
  . "</td>\n</tr>\n";
  }
  $stmt->close();
}
$mysqli->close();
echo $group_ID;
?>
</table>
</body>
</html>

</div>
</div>  <!--div['main' wird geschlossen]-->
<?php include('footer.php');
?>
</body>
</html>

Was stellst du hier fest?

Richtig! Doppelte doctypes, html- & body-Tags etc..
Außerdem verbindest du dich zweimal mit der Datenbank und startet die Session ebenfalls zweimal.
Lass HTML HTML sein und PHP PHP. Trenne beides. Schau dir das MVC-Prinzip bitte an, dann solltest du es verstehen.

Und nun zu der unschönen Lösung (den Chirurgen-Job darfst du übernehmen):

PHP:
<!DOCTYPE html>
<html>
<head>
  <link href="styles/styles.css" rel="stylesheet" type="text/css" />
  <title>Vorbereitete Anweisung: SELECT</title>
  <meta charset="UTF-8" />
</head>
<body>
<div class='rahmen'>
<header>
  <ul id='headerleiste'>
  <li id='header_links'><input type="button" value="zurück" onclick="window.location.href='db_gruppen.php'" /></li>
  <li id='header_mitte'>Gruppendetails</li>
  <li id='header_rechts'><a href="db_insert.php?group_ID=<?php echo $_GET['group_ID'] ?>"><button> + </button></a></li>
  </ul>   
</header>
<hr>
<div class='main'>  <!--div['main' wird geöffnet]-->
  <div class='content'>
  <!--Ausgabe Gruppeninformation-->
<?php
$mysqli = new mysqli("localhost", "root", "root", "test");
if ($mysqli->connect_error) {
  echo "Fehler bei der Verbindung: " . mysqli_connect_error();
  exit();
}
if (!$mysqli->set_charset("utf8")) {
  echo "Fehler beim Laden von UTF8 ". $mysqli->error;
}

//Unnötig, sehe aus dem aktuellen Code den Sinn nicht dahinter
#session_start();


$group_ID = 2; //Für Debug $_GET['group_ID'];
//Unnötig, sehe aus dem aktuellen Code den Sinn nicht dahinter
#$_SESSION['group_ID'] = $group_ID;
$suche = $group_ID; //Warum nicht gleich $group_ID ?
if($stmt = $mysqli->prepare(
  "SELECT
  groups.description
  FROM
  groups
  WHERE
  groups.group_ID LIKE ?
  ")) {
  $stmt->bind_param("i",  $suche);
  $stmt->execute();
  $stmt->bind_result($description);
  echo "<table border='1'>\n";
  while($stmt->fetch()) {
  echo "<tr>\n\t<td>Beschreibung</td><td>"
  . htmlspecialchars($description)
  . "</td>\n</tr>\n";
  }
  $stmt->close();
}
//Nicht gut, wenn später noch Abfragen folgen.
#$mysqli->close();
?>
</table>
<br>
<br>  <!--Ausgabe Notizen pro Gruppe-->
<?php
//Haben wir schon
#$group_ID = $_GET['group_ID'];
?>
<!DOCTYPE html>
<html>
<head>
  <link href="styles/styles.css" rel="stylesheet" type="text/css" />
  <title>Vorbereitete Anweisung: SELECT</title>
  <meta charset="UTF-8" />
</head>
<body>
  <!--Ausgabe Gruppeninformation-->
<?php
//Unnötig, sehe aus dem aktuellen Code den Sinn nicht dahinter
#$group_ID = $_SESSION['group_ID'];
$suche = $group_ID; //Warum nicht gleich $group_ID ?
if($stmt = $mysqli->prepare(
  "SELECT
  notice.titel,
  notice.notice
  FROM
  notice
  WHERE
  notice.group_ID LIKE ?
  ")) {
  $stmt->bind_param("i",  $suche);
  $stmt->execute();
  $stmt->bind_result($titel, $notice);
  echo "<table border='1'>\n";
  while($stmt->fetch()) {
  echo "<tr>\n\t<td>Titel</td><td>"
  . htmlspecialchars($titel)
  . "</td><tr></tr><td>Notiz</td><td>"
  . htmlspecialchars($notice)
  . "</td>\n</tr>\n";
  }
  $stmt->close();
}
$mysqli->close(); //Letzte Abfrage? Dann schließen.
echo $group_ID;
?>
</table>
</body>
</html>

</div>
</div>  <!--div['main' wird geschlossen]-->
<?php
   include('footer.php'); //Bestimmt auch wieder mit HTML-Deklaration...
?>
</body>
</html>

Gruß
 
...
* Die Datenbankverbindung wurde bereits wieder geschlossen.
...

Und genau daran lag es. @Mutschas hat es auch nochmal im Text mit einen Kommentar versehen. Ich hatte die Verbindung geschlossen und wollte danach erneut etwas abfragen, das konnte ja nicht klappen.

Jetzt hab ich erstmal den den Code bereinigt und optimiert!
Meinen Dank nochmal an euch beide.

@Mutschas
Nein, der Footer ist relativ sauber. So sieht der aus ;)
HTML:
<footer>
    <hr>
    <ul id='footerleiste'>
        <li id="aktuelles"><a href="db_aktuelles.php" title="Aktuelles">Aktuelles</a></li>
        <li id="gruppen"><a href="db_gruppen.php" title="Gruppen">Gruppen</a></li>
        <li id="kontakte"><a href="db_kontakte.php" title="Kontakte">Kontakte</a></li>
        <li id="einstellungen"><a href="db_einstellungen.php" title="Einstellungen">Einstellungen</a></li>
    </ul>
</footer>

@Mutschas
Das MVC-Prinzip verwirrt mich doch noch etwas. Sieht jedenfalls für meinen momentanen Wissensstand noch sehr kompliziert aus.
 
Zurück
Oben