mysqli prepare und fetch

marco_ru

Mitglied
hallo habe ein kleines freundesystem erstellt, nur kommt da immer ein Fehler wenn ich ein Freund hinzufügen möchte hier mal der code:

PHP:
<?php
$ret = array();
$ret['filename'] = 'friends.tpl';
$ret['title'] = 'Freunde';
$ret['data'] = array();
if (!$UserID = getUserID($db)) {
    return NOT_LOGGED_IN;
}
// Auslesen der Freundesliste
// Wenn Freund aktiviert ist; Enabled = 1

$sql = 'SELECT
			Friends.ID,
			Friends.UserID,
			Friends.FriendID,
			User.Username
        FROM
            Friends
		JOIN
			User 
		WHERE
			Friends.UserID = User.ID
		AND
			Enabled = 1';

if (!$stmt = $db->prepare($sql)) {
    return $db->error;
}
if (!$stmt->execute()) {
    return $stmt->error;
}
$Friends = array();
$stmt->bind_result($ID, $UserID, $Friend, $Username);
$i = 0;
while ($stmt->fetch()) {
      $Friends[$i] = $Username;
	$i ++;
}
$stmt->store_result();
$stmt->close();

// Auslesen der Freundesliste
// Wenn Freund noch nicht aktiviert ist; Enabled = 0

$sql = 'SELECT
			Friends.ID,
			Friends.UserID,
			Friends.FriendID,
			User.Username
        FROM
            Friends
		JOIN
			User 
		WHERE
			Friends.UserID = User.ID
		AND
			Enabled = 0';
if (!$stmt = $db->prepare($sql)) {
    return $db->error;
}
if (!$stmt->execute()) {
    return $stmt->error;
}
$akt = array();
$stmt->bind_result($ID, $UserID, $Friend, $Username);
$i = 0;
while ($stmt->fetch()) {
      $Friends_akt[$i] = $Username;
	$i ++;
}
$stmt->store_result();
$stmt->close();

if ('POST' == $_SERVER['REQUEST_METHOD']) {
	    if (!isset($_POST['Username_friend'])) {
        return INVALID_FORM;
    }
	
	if($_POST['Username_friend'] == ""){ 
		return EMPTY_FORM;
	}
	
//Neuen Freund eintragen	

$sql = 'SELECT
			Username
			ID
        FROM
            User 
		WHERE
			ID = ?';
	if (!$stmt = $db->prepare($sql)) {
    return $db->error;
	}
	$stmt->bind_param('s',$_POST['Username_friend']);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	if($stmt->num_rows() > 0){	
		$sql = "INSERT INTO 
					Friends (UserID, FriendID)
				VALUES
					(?, ?)";
		$stmt = $db->prepare($sql);
		if (!$stmt) {
			return $db->error;
		}
		$stmt->bind_param('is', $UserID, $_POST['Username_friend']);
		if (!$stmt) {
			return $db->error;
		}
		$stmt->execute();
		if (!$stmt) {
			return $db->error;
		}
	}
}
if(isset($Friends_akt)){
$ret['data']['Friends_akt'] = $Friends_akt;
}
$ret['data']['Friends'] = $Friends;
$ret['data']['akt'] = $akt;
return $ret;
?>

hier noch der Fehler:
Warning: mysqli::prepare() [mysqli.prepare]: All data must be fetched before a new statement prepare takes place in /srv/www/httpd/phost/p/de/pytalhost/pokeprof/web/new/Includes/functions.php on line 54

hier die function.php

PHP:
function getUserID($db) {
    if (!is_object($db)) {
        return false;
    }
    if (!($db instanceof MySQLi)) {
        return false;
    }
    if (!isset($_COOKIE['UserID'], $_COOKIE['Password'], $_COOKIE['Username'])) {
        return false;
    }
    $sql = 'SELECT
                ID
            FROM
                User
            WHERE
                ID = ? AND
                Password = ? AND
				Username = ?';
    $stmt = $db->prepare($sql);
    if (!$stmt) {
        return $db->error;
    }
    $stmt->bind_param('iss', $_COOKIE['UserID'], $_COOKIE['Password'], $_COOKIE['Username']);
    if (!$stmt->execute()) {
        $str = $stmt->error;
        $stmt->close();
        return $str;
    }
    $stmt->bind_result($UserID);
    if (!$stmt->fetch()) {
        $stmt->close();
        return false;
    }
	$stmt->store_result();
    $stmt->close();
    return $UserID;
}

der fehler kommt nur wenn ich einen freund eintrage
 
Könntest Du so freundlich sein, und die Zeile 54 der function.php plus ein paar Zeilen davor und danach posten?

mfg
 
PHP:
    $sql = 'SELECT
                ID
            FROM
                User
            WHERE
                ID = ? AND
                Password = ?';
    $stmt = $db->prepare($sql);
/*zeile 54*/    if (!$stmt) {
        return $db->error;
    }
    $stmt->bind_param('is', $_COOKIE['UserID'], $_COOKIE['Password']);
    if (!$stmt->execute()) {
        $str = $stmt->error;
        $stmt->close();
        return $str;
    }
 
Komischerweise schaut die function.php für mich völlig korrekt aus... kann aber auch daran liegen, dass ich total übermüdet bin.

Mir scheint im Code zum einfügen steckt ein kleiner Fehler, teste es bitte mal mit diesem:
PHP:
if ('POST' == $_SERVER['REQUEST_METHOD']) { 
    if (!isset($_POST['Username_friend'])) { 
        return INVALID_FORM; 
    } 
     
    if($_POST['Username_friend'] == ""){  
        return EMPTY_FORM; 
    } 
     
    //Neuen Freund eintragen     
    
    $sql = 'SELECT 
                Username 
                ID 
            FROM 
                User  
            WHERE 
                ID = ?'; 
    if (!$stmt = $db->prepare($sql)) { 
    return $db->error; 
    } 
    $stmt->bind_param('s',$_POST['Username_friend']); 
    if (!$stmt->execute()) { 
        return $stmt->error; 
    } 
    if($stmt->num_rows() > 0){
        /* Aenderung start */
        $stmt->close(); // Query beenden
        /* Aenderung ende */
        $sql = "INSERT INTO  
                    Friends (UserID, FriendID) 
                VALUES 
                    (?, ?)"; 
        $stmt = $db->prepare($sql); 
        if (!$stmt) { 
            return $db->error; 
        } 
        $stmt->bind_param('is', $UserID, $_POST['Username_friend']); 
        if (!$stmt) { 
            return $db->error; 
        } 
        $stmt->execute(); 
        if (!$stmt) { 
            return $db->error; 
        } 
    } 
}

Bitte nicht schlagen, wenn es nicht funktioniert. :D

mfg
 
Teste es mal bitte mit dieser Variante.
Zum Eintragen:
PHP:
<?php
if ( 'POST' == $_SERVER['REQUEST_METHOD'] ) {
    if ( !isset($_POST['Username_friend'] ) ) {
        return INVALID_FORM;
    }

    if( $_POST['Username_friend'] == '' ) {
        return EMPTY_FORM;
    }

    // Neuen Freund eintragen
    $sql = "SELECT
                Username
                ID
            FROM
                User
            WHERE
                ID = ?";

    if ( !$stmt = $db->prepare( $sql ) ) {
        return $db->error;
    }

    $stmt->bind_param( 's', $_POST['Username_friend'] );

    if ( !$stmt->execute() ) {
        $str = $stmt->error;
        $stmt->close(); // close statement
        return $str;
    }

    $stmt->store_result();

    if( $stmt->num_rows() > 0 ) {
        $stmt->close(); // close statement

        $sql = "INSERT INTO
                    Friends (UserID, FriendID)
                VALUES
                    (?, ?)";

        if ( !$stmt = $db->prepare( $sql ) ) {
            return $db->error;
        }

        $stmt->bind_param( 'is', $UserID, $_POST['Username_friend'] );

        if ( !$stmt->execute() ) {
            $str = $stmt->error;
            $stmt->close(); // close statement
            return $str;
        }

        $stmt->store_result();
    }

    $stmt->close(); // close statement
}
?>

functions.php:
PHP:
<?php
function getUserID( $db ) {
    if ( !is_object( $db ) ||
         !( $db instanceof MySQLi ) ||
         !isset( $_COOKIE['UserID'],
                 $_COOKIE['Password'],
                 $_COOKIE['Username'] ) ) {
        return false;
    }

    $sql = 'SELECT
                ID
            FROM
                User
            WHERE
                ID = ? AND
                Password = ? AND
                Username = ?';

    if ( !$stmt = $db->prepare( $sql ) ) {
        return $db->error;
    }

    $stmt->bind_param(
        'iss', $_COOKIE['UserID'], $_COOKIE['Password'], $_COOKIE['Username']
    );

    if ( !$stmt->execute() ) {
        $str = $stmt->error;
        $stmt->close(); // close statement
        return $str;
    }

    $stmt->bind_result( $UserID );

    if (!$stmt->fetch()) {
        $stmt->close(); // close statement
        return false;
    }

    $stmt->store_result();
    $stmt->close(); // close statement
    return $UserID;
}
?>

Falls er wieder einen Error raushaut, poste diesen bitte. :D

mfg
 
Zurück