2016-07-11 11 views
1

Ich habe Mysql Verfahren gespeichert werden, dass in einigen Fällen ein Signalfehler wie folgt ergeben:Mysqli Signal an PHP Fehler

CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertAction`(IN `EmployerID` INT, IN `StoreFromID` INT, IN `StoreToID` INT, IN `StoreID` INT, IN `ProductID` INT, IN `Quantity` DECIMAL(10,2), IN `DualOperation` TINYINT, IN `inOrOut` TINYINT) 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 
    START TRANSACTION; 
     SELECT @lastActionID; 
     SELECT @lastTransferID; 
     SELECT @retval; 
     SELECT SUM(ad.Quantity) INTO @retVal FROM productin pri JOIN actiondetails ad ON ad.ID=pri.ID; 
     IF DualOperation = 1 
      THEN 
       IF @retVal>Quantity 
        THEN 
         INSERT INTO Actions (EmployerID, StorehouseID, `Date`) 
          VALUES (EmployerID, StoreFromID, CURDATE()); 
         SET @lastActionID = (SELECT ID FROM Actions ORDER BY ID DESC LIMIT 1); 
         INSERT INTO ProductTransfer (ID, TransferType) 
          VALUES (@lastActionID, 0); 

         INSERT INTO ActionDetails (ID,ProductID, Quantity) 
          VALUES (@lastActionID, ProductID, Quantity); 

         SET @lastTransferID = (SELECT ID FROM ProductTransfer ORDER BY ID DESC LIMIT 1); 
         INSERT INTO Actions (EmployerID, StorehouseID, `Date`) VALUES (EmployerID, StoreToID, CURDATE()); 
         SET @lastActionID = (SELECT ID FROM Actions ORDER BY ID DESC LIMIT 1); 
         INSERT INTO ProductTransfer (ID, TransferType, ParentID) VALUES (@lastActionID, 1, @lastTransferID); 

         INSERT INTO ActionDetails (ID,ProductID, Quantity) 
          VALUES (@lastActionID, ProductID, Quantity); 
        ELSE 
         SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Not enough materials'; 
      END IF; 
     ELSE 
       INSERT INTO Actions (EmployerID, StorehouseID, `Date`) 
        VALUES (EmployerID, StoreID, CURDATE()); 
       SET @lastActionID = (SELECT ID FROM Actions ORDER BY ID DESC LIMIT 1); 
       INSERT INTO ActionDetails (ID, ProductID, Quantity) 
        VALUES (@lastActionID, ProductID, Quantity); 
       IF InOrOut = 0 
        THEN 
         INSERT INTO ProductIn (ID, OrganizationID) values (@lastActionID, NULL); 
        ELSE 
         IF @retVal>Quantity 
          THEN 
           INSERT INTO ProductOut (ID, OrganizationID) values (@lastActionID, NULL); 
          ELSE 
           SIGNAL SQLSTATE '45000' 
          SET MESSAGE_TEXT = 'Not enough materials'; 
        END IF; 
       END IF; 
     END IF; 
    COMMIT; 
END 

Wenn ich diesen Code durch Mysql laufen alles abfragen scheint ganz gut zu funktionieren. es gibt ein Signal von "nicht genug Materialien" IF @retVal<=Quantity und keine Datensätze eingefügt werden (funktioniert wie es sein sollte) ... Aber wenn ich diese Prozedur von PHP aufrufen, gibt es einfach keinen Fehler. keine der Zeilen eingefügt werden, aber ich kann Benachrichtigung erhalten, dass die oppreration gescheitert ... hier ist PHP-Code:

$mysqli->query("CALL `InsertAction`('6', '1', '2', '0', '13', '431243241', '1', '0')"); 

the $mysqli->sqlstate gibt 0000. Wie soll ich verstehen, dass das Verfahren durchgeführt wurde oder ein Signal erhalten hat?

also was ich wirklich will ist, wenn @retVal<=Quantity dann php ausnahme geben. und dieser Code druckt "string" aus:

try { 
$mysqli->query("CALL `InsertAction`(6, 1, 2, 0, 13, 431243241, 1, 0)"); 
} 
catch (Exception $e){ 
    echo "string"; 
} 
+0

Try Gang INT Parameter als INT und nicht Strings in verfuhr die einfachen Anführungszeichen um Zahlen entfernen, dh, die dann Textfelder – RiggsFolly

+0

machen Wer schrieb das hat den Signalzustand für diese 2 Bedingungen. PHP kann es wie jede try/catch Ausnahme behandeln. – Drew

+0

Mögliches Duplikat von [MySQL Rollback im Handler] (http://stackoverflow.com/questions/35241571/mysql-rollback-in-handler) – Drew

Antwort

0

paßt Code oben ist, dass Variablen nicht deklariert werden. Also habe ich diese Select-Anweisungen in Declare-Anweisungen geändert.

BEGIN 
DECLARE lastActionID INT unsigned; 
DECLARE lastTransferID INT unsigned; 
DECLARE retval INT unsigned; 
    START TRANSACTION; 
     SELECT SUM(ad.Quantity) INTO retVal FROM productin pri JOIN actiondetails ad ON ad.ID=pri.ID; 
     IF DualOperation = 1 
      THEN 
       IF retVal>Quantity 
        THEN 
         INSERT INTO Actions (EmployerID, StorehouseID, `Date`) 
          VALUES (EmployerID, StoreFromID, CURDATE()); 
         SET lastActionID = (SELECT ID FROM Actions ORDER BY ID DESC LIMIT 1); 
         INSERT INTO ProductTransfer (ID, TransferType) 
          VALUES (lastActionID, 0); 

         INSERT INTO ActionDetails (ID, ProductID, Quantity) 
          VALUES (lastActionID, ProductID, Quantity); 

         SET lastTransferID = (SELECT ID FROM ProductTransfer ORDER BY ID DESC LIMIT 1); 
         INSERT INTO Actions (EmployerID, StorehouseID, `Date`) VALUES (EmployerID, StoreToID, CURDATE()); 
         SET lastActionID = (SELECT ID FROM Actions ORDER BY ID DESC LIMIT 1); 
         INSERT INTO ProductTransfer (ID, TransferType, ParentID) VALUES (lastActionID, 1, lastTransferID); 

         INSERT INTO ActionDetails (ID,ProductID, Quantity) 
          VALUES (lastActionID, ProductID, Quantity); 
        ELSE 
         SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Not enough materials'; 
      END IF; 
     ELSE 
       INSERT INTO Actions (EmployerID, StorehouseID, `Date`) 
        VALUES (EmployerID, StoreID, CURDATE()); 
       SET @lastActionID = (SELECT ID FROM Actions ORDER BY ID DESC LIMIT 1); 
       INSERT INTO ActionDetails (ID, ProductID, Quantity) 
        VALUES (lastActionID, ProductID, Quantity); 
       IF InOrOut = 0 
        THEN 
         INSERT INTO ProductIn (ID, OrganizationID) values (lastActionID, NULL); 
        ELSE 
         IF retVal>Quantity 
          THEN 
           INSERT INTO ProductOut (ID, OrganizationID) values (lastActionID, NULL); 
          ELSE 
           SIGNAL SQLSTATE '45000' 
          SET MESSAGE_TEXT = 'Not enough materials'; 
        END IF; 
       END IF; 
     END IF; 
    COMMIT; 
    select true; 
END 

jetzt bin ich in der Lage $mysqli->sqlstate45000 und überprüfen zu bekommen, ob es ein Fehler

0

MYSQLI werfen keine Ausnahmen Sie auf die altmodische Weise

$result = $mysqli->query("CALL InsertAction(6, 1, 2, 0, 13, 431243241, 1, 0)"); 
if ($result === false) { 
    echo $mysqli->error; 
    exit; 
} 

Auch die sechste param eine Dezimalzahl zu tun haben, ist (10,2) nicht ein int die Nummer, die Sie, dass 10,2 nicht passt sind vorbei, die, wenn ich mich richtig 8 Stellen vor dem Komma bedeutet rememebr und 2 nach, so eine Reihe versuchen, das eigentliche Problem in dem wie

$result = $mysqli->query("CALL InsertAction(6, 1, 2, 0, 13, 4312432.41, 1, 0)");