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";
}
Try Gang INT Parameter als INT und nicht Strings in verfuhr die einfachen Anführungszeichen um Zahlen entfernen, dh, die dann Textfelder – RiggsFolly
machen Wer schrieb das hat den Signalzustand für diese 2 Bedingungen. PHP kann es wie jede try/catch Ausnahme behandeln. – Drew
Mögliches Duplikat von [MySQL Rollback im Handler] (http://stackoverflow.com/questions/35241571/mysql-rollback-in-handler) – Drew