1

我有以下代码:

<?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);
?>

它总是让我回滚,但我不明白为什么。

对此有任何线索吗?log.txt 存档中生成的代码可以在 PHP MY ADMIN 中毫无问题地执行。(我知道没有引用变量,但这是更大脚本的一部分)。

非常感谢。

4

4 回答 4

1

你的测试方法不好。mysql_query() 在错误时返回布尔值 FALSE,或在成功时返回结果。根据 PHP 的类型转换规则,一个结果句柄测试等于 true。您必须使用严格的布尔比较,并明确测试是否为 false:

if (mysql_query($mysql_doc_query) !== FALSE)
于 2012-08-07T20:06:15.410 回答
1

您不能同时发送两个 mysql 查询。您正在发送两个不同的 INSERT 查询。

此外,您必须发送不带“;”的查询 因为它是自动添加的。

于 2012-08-07T20:08:45.707 回答
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!";
  }

如果您需要执行两次INSERTs,则需要两次单独调用mysql_query(),并在每次调用后检查错误。在任何一个失败时,做你的ROLLBACK.

于 2012-08-07T20:08:59.823 回答
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");
 }
于 2012-08-07T20:15:42.977 回答