Mysqli_stmt_bind_param ile dize içeren @ karakterini bağlanamıyor

1 Cevap php

I have a problem with my database class. I have a method that takes one prepared statement and any number of parameters, binds them to the statement, executes the statement and formats the result into a multidimentional array. Everthing works fine until I try to include an email adress in one of the parameters. The email contains an @ character and that one seems to break everything. When I supply with parameters:

$types = "ss" and $parameters = array("email@domain.com", "testtest")

Ben hata alıyorum:

Warning: Parameter 3 to mysqli_stmt_bind_param() expected to be a reference, value given in ...db/Database.class.php on line 63

Burada bir yöntemdir:

private function bindAndExecutePreparedStatement(&$statement, $parameters, $types) {
    if(!empty($parameters)) {
        call_user_func_array('mysqli_stmt_bind_param', array_merge(array($statement, $types), &$parameters));
        /*foreach($parameters as $key => $value) {
            mysqli_stmt_bind_param($statement, 's', $value);
        }*/
    }

    $result = array();

    $statement->execute() or debugLog("Database error: ".$statement->error);

    $rows = array();

    if($this->stmt_bind_assoc($statement, $row)) {
        while($statement->fetch()) {
            $copied_row = array();
            foreach($row as $key => $value) {
                if($value !== null && mb_substr($value, 0, 1, "UTF-8") == NESTED) { // If value has a nested result inside
                    $value = mb_substr($value, 1, mb_strlen($value, "UTF-8") - 1, "UTF-8");
                    $value = $this->parse_nested_result_value($value);
                }
                $copied_row[$ke<y] = $value;
            }
            $rows[] = $copied_row;
        }
    }

    // Generate result
    $result['rows'] = $rows;
    $result['insert_id'] = $statement->insert_id;
    $result['affected_rows'] = $statement->affected_rows;
    $result['error'] = $statement->error;

    return $result;
}

Ben aldık bir öneri ki:

the array_merge is casting parameter to string in the merge change it to &$parameters so it remains a reference

Yani (yöntemin 3 hat) da denedim, ancak herhangi bir fark yapmadım.

Ben nasıl yapmalıyım? Call_user_func_array olmadan bunu yapmak için daha iyi bir yolu var mı?


update: Ben bu çözmenin bir az güzel yolunu buldu. Ne yaptım bir döngü ile yeni bir referans dizi oluşturmak ve bunun yerine birini kullanmak oldu.

private function bindAndExecutePreparedStatement($statement, $parameters, $types)
{
    if(!empty($parameters)) {
        $parameters_references = array();
        foreach($parameters as $key => $parameter) {
            $parameters_references[] = &$parameters[$key]; 
        }
        call_user_func_array('mysqli_stmt_bind_param', 
            array_merge(array($statement, $types), $parameters_references)); 
    } 
    .... 

O da diğer işlevsellik bir sürü var gibi ben hala PDO ile bu çözmede ilgileniyorum, bu l görünüyor. Ben sadece onu kullanmayı öğrenmiş değil.

1 Cevap

Ben Zend Framework MySQLi adaptörü parametre bağlama kod yazdı. Ben MySQLi için parametre bağlama API kullanımı zor buluyorum. Bu bir referans olması gerekiyor dizi değil, each element dizinin bulunuyor.

You can see the code I wrote in the _execute() method in this class: http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Db/Statement/Mysqli.php

Ben PDO kontrol etmenizi öneririz. Bu kullanımı çok daha kolay. Sen parametreleri bağlamak olabilir, ama bu sadece PDOStatement en execute() yöntemi için bir dizi olarak parametre değerleri dizisi geçmek daha kolay.