2016-08-06 12 views
1

ich diesen Code bekam:PHP MYSQL Transaktion gibt Fehler SQLSTATE [HY000]: Allgemeiner Fehler

$qry = "BEGIN; SELECT title FROM properties WHERE id=? LIMIT 1; COMMIT"; 
$arr = array(59); 
$stmt = $data_users->default_query($qry, $arr); 

print_r($stmt); 

und dies ist meine Funktion:

public function default_query($qry, $arr) 
{ 
    try { 
     $stmt = $this->con->prepare($qry); 
     $stmt->execute($arr); 

     return $stmt->fetch(PDO::FETCH_ASSOC); 
    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
} 

und es gibt den Fehler, wenn ich zu verarbeiten versuchen das Ergebnis, aber wenn ich die gleiche Abfrage direkt auf SQL tun bekam ich dieses Ergebnis:

Titel

Titeltest

Dies ist das Wunschergebnis, aber ich kann es nicht auf meiner App bekommen. Allerdings, wenn ich den $ qry zu ändern:

//Remove the begin And Commit stuff; 
$qry = "SELECT title FROM properties WHERE id=? LIMIT 1"; 

Es funktioniert, das Problem ist, dass ich brauche Transaktionen zu verwenden, weil ich später ein paar Sachen tun muß, legen letzten id auf einigen anderen Tabellen und, ich reduzierte die Code auf das Minimum, den Fehler zu reproduzieren, aber ich kann es nicht herausgefunden, ich glaube, es hat etwas mit der Funktion der Rückkehr zu tun hat, sondern im Handbuch sagt es

PDO::FETCH_ASSOC: returns an array indexed by column name as returned in your result set

Und das ist, was ich in diesem Moment brauche . Benutze ich das falsche FETCH? Danke in fortgeschrittenem.

UPDATE Ok, habe ich versucht, diese neue Funktion und ich bekomme jetzt ein Boolesches Ergebnis

$qry = "SELECT title FROM properties WHERE id=59 LIMIT 1"; 

public function commit_query($qry){ 
    try { 
     $stmt = $this->con->beginTransaction(); 

     $stmt = $this->con->prepare($qry); 
     $stmt->execute(); 
     $stmt = $this->con->commit(); 
     return $stmt->fetch(PDO::FETCH_ASSOC); 
    } catch (Exception $e) { 
     $stmt = $this->con->rollback(); 
    } 
} 
// I got this error which its OK according to this 

Returns TRUE on success or FALSE on failure.

Fatal error: Call to a member function fetch() on boolean in 

Gibt es trotzdem ein hier Ergebnis zu erhalten holen?

Noch ein weiteres Update

Ok jetzt habe ich diese Funktion:

public function commit_query_withId($qry,$arr,$multiqry){ 
try { 
$stmt = $this->con->beginTransaction(); 

$stmt = $this->con->prepare($qry); 
$stmt->execute($arr); 
$lastId = $this->con->lastInsertId(); 

$stmt = $this->con->prepare($multiqry); 
$stmt->execute(); 

$stmt = $this->con->commit(); 

return compact("lastId","stmt"); 

} catch (Exception $e) { 
    $stmt = $this->con->rollback(); 
} 
} 

Und ich diese Anfragen senden:

//capturedby comes from an array ex:<select name="capturedby[]" 
$elements = $_POST['capturedby']; 

foreach ($elements as $x){ 
    $sql[] = '(LAST_INSERT_ID(), '.$x.')'; 
} 
$data_users=new database_data(); 

$qry = "INSERT INTO properties (title, ...)". "VALUES (:tit,...);"; 
$arr = array(':tit'=>$_POST['title'],...); 

$multiqry='INSERT INTO captured_by (property_id, users_admin_id) VALUES '.implode(',', $sql); 

$stmt=$data_users->commit_query_withId($qry,$arr,$multiqry); 

if ($stmt["stmt"]==true) { 
    $data['valid'] = true; 
    $data['response'] = $msg_echo->messages('3'); 
    $data['id'] = $stmt['lastId']; 
}else{ 
    $data['valid'] = false; 
    $data['response'] = $msg_echo->messages('4'); 
} 

Jetzt habe ich zwei erfolgreiche Einsätze und die zuletzt eingefügten ID in einem $ var, also denke ich, das funktioniert für jetzt.

+0

Dies könnte für die Infomation http: // stackoverflow nützlich sein.com/questions/6346674/pdo-support-für-mehrere-Abfragen-pdo-mysql-pdo-mysqlnd – RiggsFolly

Antwort

0

Die beste Lösung ist die Verwendung PDO tools for transactions. Und entfernen Sie BEGIN, COMMIT von SQL-Abfrage.

Über PDO und commit() ... Ich glaube, Sie den Fehler bekommen, weil fetch() Anrufe nach commit(). Auf diese Weise ohne Fehler:

$stmt = $this->con->beginTransaction(); 
$stmt = $this->con->prepare($qry); 
$stmt->execute(); 

$result = $stmt->fetch(PDO::FETCH_ASSOC); 

$this->con->commit(); 

return $result; 

Ich hoffe, das ist, was Sie brauchen.

+0

Wirklich ein Kommentar, aber ich muss zustimmen – RiggsFolly

+0

Ich stimme Ihnen zu - zu kurze Antwort))) –

+1

I Don ' Ich weiß nicht, warum jemand diesen hier gewählt hat, er hat mich auf den richtigen Weg gebracht, ich akzeptiere ihn nicht als Antwort, nur weil er das Fetch-Ergebnis noch nicht löst ... für den Moment verwende ich den wahren Wert zu mach weiter, ich poste den Code in ein paar – ryangus

Verwandte Themen