我有以下代码:
<?php
// Conexion a MySQL
$mysql_link = mysql_connect( 'localhost', 'root', '010101' );
if (!$mysql_link) {
die('No se pudo conectar a la DB: ' . mysql_error());
}
$mysql_db = mysql_select_db('test', $mysql_link);
if (!$mysql_db) {
die ('No se pudo seleccionar DB: ' . mysql_error());
}
$mysql_doc_query = "INSERT INTO documents (name, wfid, docid, archivo) VALUES ('{$CodDoc}: {$documentoNombre} de {$DNI}', '{$workflowNombre}', '{$documentoNombre}', '{$archivoNombre}' );
INSERT INTO keywords (document_id, keyword, value) VALUES (LAST_INSERT_ID(), 'DNI', '{$DNI}' ), (LAST_INSERT_ID(), 'Cuit Empleador',
'{$cuitEmpleador}' ), (LAST_INSERT_ID(), 'DigitalizadoPor', '{$usuario}' ),
(LAST_INSERT_ID(), 'Direccion IP', '{$IP}' ), (LAST_INSERT_ID(), 'Ubicacion', CONCAT('pdfs/',LAST_INSERT_ID(),'.pdf') );";
// Insert en mysql
$log = fopen('/dev/shm/log.txt', 'w');
if( $log ) {
fwrite( $log, $mysql_doc_query );
}
mysql_query("START TRANSACTION");
if (mysql_query($mysql_doc_query) == TRUE)
{
mysql_query("COMMIT");
echo "\nCOMMIT!";
}
else {
mysql_query("ROLLBACK");
echo "\nROLLBACK!";
}
mysql_close($mysql_link);
fclose ($log);
?>
它总是给我ROLLBACK,但我不明白为什么。
有什么线索吗? log.txt存档中生成的代码可以在PHP MY ADMIN中执行而不会出现问题。 (我知道变量没有被引用,但这是一个更大的脚本的一部分。)
非常感谢。
答案 0 :(得分:1)
您的测试方法很糟糕。 mysql_query()在出错时返回一个布尔值FALSE,或者在成功时返回结果。通过PHP的类型转换规则,结果句柄测试等于true。您必须使用严格的布尔比较,并对false进行明确的测试:
if (mysql_query($mysql_doc_query) !== FALSE)
答案 1 :(得分:1)
您不能同时发送两个mysql查询。您正在发送两个不同的INSERT查询。
此外,您必须在没有';'的情况下发送您的查询因为它是自动添加的。
答案 2 :(得分:1)
mysql_query()
一次只支持一个语句。您正在一次执行多个INSERT
语句:
$mysql_doc_query = "INSERT INTO documents (name, wfid, docid, archivo) VALUES ('{$CodDoc}: {$documentoNombre} de {$DNI}', '{$workflowNombre}', '{$documentoNombre}', '{$archivoNombre}' );
// Oops, new statement here! mysql_query() can't do that.
INSERT INTO keywords (document_id, keyword, value) VALUES (LAST_INSERT_ID(), 'DNI', '{$DNI}' ), (LAST_INSERT_ID(), 'Cuit Empleador',
'{$cuitEmpleador}' ), (LAST_INSERT_ID(), 'DigitalizadoPor', '{$usuario}' ),
(LAST_INSERT_ID(), 'Direccion IP', '{$IP}' ), (LAST_INSERT_ID(), 'Ubicacion', CONCAT('pdfs/',LAST_INSERT_ID(),'.pdf') );";
可以使用mysql_error()
块中的ROLLBACK
进行调试:
if (mysql_query($mysql_doc_query) == TRUE)
{
mysql_query("COMMIT");
echo "\nCOMMIT!";
}
else {
echo "Error in query: " . mysql_error();
mysql_query("ROLLBACK");
echo "\nROLLBACK!";
}
如果您需要执行两次INSERT
,则需要对mysql_query()
进行两次单独调用,并在每次调用后检查错误。如果失败,请执行ROLLBACK
。
答案 3 :(得分:1)
运行事务的标准方法包括以下步骤:
mysql_query("SET AUTOCOMMIT=0"); //by default this is 1
mysql_query("START TRANSACTION"); // start the transaction
//run all the queries, possibly in a loop
$q1 = mysql_query("INSERT INTO .... ");
$q2 = mysql_query("INSERT INTO .... ");
//check the success of all the queries and based on that commit or rollback
if ($q1 and $q2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}