Mysqli mehrfach abfrage

latinum_1982

Erfahrenes Mitglied
Hallo freunde...

Als ersten muss ich mal die Seite Loben denn bin heute drauf gekommen das es auch eine mobile version gibt :) *grossesblog*

Ich will wie der Titel schon sagt möchte ich folgendes (etwas genauer)

Der user hat die möchlichkeit über 5 Stück select felder die Datenbank zu durch suchen..
Wie kann ich das jetzt in die tat umsetzten ohne das ich jetzt fast 20 abfragen codiere?

Hab googlet aber find nicht passendes weil ich mich gut auskenne :(

Vielleiht könnt Ihr mir ja Tipps geben wie ich das umsetzten kann..

Lg ausn kalten österreich
 
Hallo

Die Seite war ein Hit aber ich komm nur mitn bind_param nicht weiter

Das ganze Schaut zurzeit so aus:
PHP-Code:
PHP:
$result = false;
        if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $wheres);
        if(count($data)>0) $datastring = "'".implode("','", $data);
        if(count($inst)>0) $inststring = "".implode("", $inst);
        $anfang = "'";
        $mitte = "',";
        $ende = "'";

$sql = 'SELECT ... FROM ...LEFT JOIN ...ON ... '.$wherestring.' ORDER BY '.$sort;
$stmt = $this->db->prepare($sql);
$stmt->bind_param($anfang.$inststring.$mitte.$datastring.$ende);
$stmt->execute();
$stmt->bind_result($str1, $str2, $str3, ...);
while($stmt->fetch()):
.
.
// wenn ich das "$anfang.$inststring.$mitte.$datastring.$ende" separat ausgebe
// kommts richtig raus
// 'ss','Franz','400'
was mach ich nur falsch oder hab ich wo einen Denkfehler.
 
Jepp, MySQLi macht solche Sachen nicht einfacher....
Ungetestet
PHP:
//Auswerten der einzelnen Kriterien
if($_POST['text1']) $p[] = array('where' => 'text1=?', 'type' => 's', 'value' => $_POST['text1']);
if($_POST['text2']) $p[] = array('where' => 'text2=?', 'type' => 's', 'value' => $_POST['text2']);
if($_POST['zahl3']) $p[] = array('where' => 'text2=?', 'type' => 'd', 'value' => $_POST['zahl3']);

//Ich  benutze hier die funktion array_extract_sub_item()
//siehe weiter unten
//Die Einzelnen Teile extrahieren
$whereA 	= array_extract_sub_item($p, 'where');
$typeA		= array_extract_sub_item($p, 'type');
$params 	= array_extract_sub_item($p, 'value');

//WHere-String zusammensetzen 
if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $whereA);
$sql = 'SELECT ... FROM ...LEFT JOIN ...ON ... '.$wherestring.' ORDER BY '.$sort;
$stmt = $this->db->prepare($sql);

//Die Typen vorne in den Paramarray werfen (als Typenstring 'ssd' oder sowas)
array_unshift($params, implode($typeA));

//Die Parameter anbinden
//PHP5.3 Fehlerbehebung mit refValues() siehe unten
call_user_func_array(array($this->db, 'prepare'), refValues(params);

//Weiter wie gewohnt
$stmt->execute();
$stmt->bind_result($str1, $str2, $str3, ...);
while($stmt->fetch()):


/**
 * Extrahieren ein Subitem aus einem mehrstufigen Array. Der Schlüssel wird beibehalten
 * http://wiki.yaslaw.info/wikka/PhpArrayExtractSubItem
 * @param   Array<Key => Array<Node>>   Ein mehrstufiger Array
 * @param   String                      Schlüssel des zu extrahierenden Item
 * @return  Array<Key => Node>
 */
function array_extract_sub_item($array, $key){
	foreach($array as $index => $item) $retArray[$index] = $item[$key];
	return $retArray;
}

/**
 * http://ca.php.net/manual/en/mysqli-stmt.bind-param.php#96770
 */
function refValues($arr){
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
    return $arr;
}
 
Hmmm jetzt bekomme ich diese Fehlermeldung:

Warning: mysqli::prepare() expects exactly 1 parameter, 6 given in E:\xampp-portable\htdocs\class\main.classl.php on line 401

Fatal error: Call to a member function execute() on a non-object in E:\xampp-portable\htdocs\class\main.classl.php on line 402


Jetzt Schaut es so aus:
PHP:
public static function array_extract_sub_item($array, $key){
    foreach($array as $index => $item) $retArray[$index] = $item[$key];
    return $retArray;
}

public static function refValues($arr){
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
    return $arr;
}




public function suche_suche($p, $wheres, $sort) {
		$result = false;	
		$whereA     = Mainmodel::array_extract_sub_item($p, 'where');
		$typeA      = Mainmodel::array_extract_sub_item($p, 'type');
		$params     = Mainmodel::array_extract_sub_item($p, 'value');
		if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $whereA);

        $sql = 'SELECT ... FROM ...LEFT JOIN ...ON ... '.$wherestring.' ORDER BY '.$sort;
        $stmt = $this->db->prepare($sql);
		array_unshift($params, implode($typeA));
		call_user_func_array(array($this->db, 'prepare'), Mainmodel::refValues($params));
		$stmt->execute();
 
jetzt Bekomm ich aber Diese Fehlermeldung :(


Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'mysqli' does not have a method 'bind_param' in E:\xampp-portable\htdocs\autofieber.at\class\main.classl.php on line 401

Fatal error: Call to a member function execute() on a non-object in E:\xampp-portable\htdocs\autofieber.at\class\main.classl.php on line 402
PHP:
//ZEILE 401 und 402
call_user_func_array(array($this->db, 'bind_param'), Mainmodel::refValues($params));
		$stmt->execute();
 
Zurück