2016-10-22 4 views
0

Я все еще новичок в PHP и MYSQL, когда я запускаю инструкцию подготовки, чтобы вставить некоторые данные в базу данных, она возвращает false, однако я могу видеть новую строку в базе данных, кто-нибудь знает Зачем? Я ценю любую помощь. Я трачу несколько часов на то, чтобы разобраться, но не повезло. И это происходит только в инструкции INSERT. И это Вот мой кодподготовить заявление вернуть false, но вставить успешно

$query = "INSERT INTO BbUsers(u_username,u_passhash,u_emailaddr,u_validate) VALUES(?,?,?,?)"; 
$refArr = array("ssss", $username, $passhash, $email, $vaildHash); 
$result = cleanQuery($query, $refArr); 

if ($result2) { 
    sendEmail($email, $hash); 
} else { 
    echo "OOps something went wrong plz try again"; 
exit; 
} 

Здесь функция для подготовки заявления

function cleanQuery($prepareState,$Arrs) 
{ 
    global $dbcon; 
    $refArr=array(); 
    $res=$dbcon->prepare($prepareState); 
    $ref= new ReflectionClass('mysqli_stmt'); 
    $method=$ref->getMethod("bind_param"); 
    foreach($Arrs as $key => &$value) 
    {$refArr[] = &$value; 
    } 
    $method->invokeArgs($res,$refArr); 
    $res->execute(); 
    $result=$res->get_result(); 
    return $result; 
} 

я попытался получить информацию об ошибке от $ Реза и $ dbcon, который она возвращает 0. Вот DB выглядит подобные

CREATE TABLE BbUsers(
u_userid INTEGER PRIMARY KEY AUTO_INCREMENT , 
u_username CHAR(60) UNIQUE , 
u_passhash CHAR(100) , 
u_emailaddr CHAR(255) UNIQUE , 
u_created TIMESTAMP , 
u_lastlogin TIMESTAMP , 
u_validate CHAR(40), 
INDEX (u_username , u_emailaddr) 
); 

Что-нибудь еще, что я пропустил>?

ответ

0

Смотрите documentation:

mysqli_stmt :: get_result

Возвращает результирующий для успешных запросов SELECT, или FALSE для других запросов DML или отказа. Функция mysqli_errno() может использоваться для различения двух типов сбоев.

So $res->get_result() работает только так, как вы ожидаете, для select.

Чтобы проверить, если ваш подготовленный оператор был выполнен правильно, то вы можете напрямую использовать возвращаемый параметр для execute:

mysqli_stmt :: выполнить

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Вы, вероятно, следует использовать две различные функции, одна для select -statements, которые возвращают набор результатов (что вы кстати придется fetch(), иначе дальнейшие запросы не будут работать, прочитайте записку в documentation to execute()), и один для других утверждений, которые возвращают true или false.

И вы, очевидно, должны заменить if ($result2) { на if ($result) {, но я предполагаю, что это только опечатка.

+0

Большое вам спасибо, это полностью решило мою проблему, а $ result2 - просто ошибка типа. Как вы сказали, мне нужна другая функция для проверки execute(). –