如何将已在 MySQL 中设置的变量返回给 PHP

Posted

技术标签:

【中文标题】如何将已在 MySQL 中设置的变量返回给 PHP【英文标题】:How to return variables that have been set in MySQL back to PHP 【发布时间】:2012-03-23 17:54:49 【问题描述】:

我有一个 php 函数可以将多条记录插入 mysql

function commit_purchase($asset_type_ID, $org_ID, $asset_desc, $asset_cost, $date, $org_to_member_ID, $asset_ID, $purchaser_cur_invest, $purchaser_cred_deb, $purchaser_balance) 
    global $db;
    $query = "START TRANSACTION;
          INSERT INTO assets
            (asset_type_ID, org_ID, asset_desc, asset_cost, asset_value, purchase_date, is_approved)
          VALUES
            (:asset_type_ID, :org_ID, :asset_desc, :asset_cost, :asset_cost, :date, 1);
          SET @asset_ID = LAST_INSERT_ID();
          INSERT INTO cash_out
            (org_to_member_ID, amount, description, date, is_approved, asset_ID)
          VALUES
            (:org_to_member_ID, :asset_cost, :asset_desc, :date, 1, @asset_ID);
          SET @cash_out_ID = LAST_INSERT_ID();
          INSERT INTO shares
            (asset_ID, member_ID, percent_owner, is_approved)
          SELECT assets.asset_ID, pending_asset_shares.member_ID, pending_asset_shares.percent_owner, pending_asset_shares.is_approved
          FROM assets, pending_asset_shares
          WHERE assets.asset_ID = @asset_ID;
          DELETE FROM pending_asset_shares
          WHERE asset_ID = :asset_ID;
          DELETE FROM pending_assets
          WHERE pending_asset_ID = :asset_ID;
          INSERT INTO trans_log
             (translog_id, trans_type, org_to_member_ID, date, purchaser, asset_ID, cur_invest, cash_out_ID, cred_deb, balance)
          VALUES
             (DEFAULT, 3, :org_to_member_ID, :date, :org_to_member_ID, @asset_ID, :purchaser_cur_invest, @cash_out_ID, :purchaser_cred_deb, :purchaser_balance);
          COMMIT;";
$statement = $db->prepare($query);
$statement->bindValue(':asset_type_ID', $asset_type_ID);
$statement->bindValue(':org_ID', $org_ID);
$statement->bindValue(':asset_desc', $asset_desc);
$statement->bindValue(':asset_cost', $asset_cost);
$statement->bindValue(':date', $date);
$statement->bindValue(':org_to_member_ID', $org_to_member_ID);
$statement->bindValue(':purchaser_cur_invest', $purchaser_cur_invest);
$statement->bindValue(':purchaser_cred_deb', $purchaser_cred_deb);
$statement->bindValue(':purchaser_balance', $purchaser_balance);
$statement->bindValue(':asset_ID', $asset_ID);
$statement->execute();
$statement->closeCursor();
return $asset_ID;

我正在尝试使用第一个 INSERT 语句的 LAST_INSERT_ID (@asset) 作为我下一个函数的变量。为了设置变量,我调用上述函数的方式是:

$asset_ID = commit_purchase($asset_type_ID, $org_ID,.......etc.)

我很确定我的问题出在我的 SQL 语句中的“return $asset_ID”附近。仅使用 1 个 LAST_INSERT_ID 调用时,我已经能够成功地做到这一点。

什么都没有返回。

【问题讨论】:

不要一次做这么多查询!每个查询都应该有一个单独的语句。 我很想将它们分开,但它们要么全部工作要么一起失败,这一点非常重要。我在交易中需要它们。无论如何将它们分开,同时将它们保留在交易中? 当然。 php.net/manual/en/pdo.begintransaction.php 这将为我节省大量工作,谢谢。但是,现在,我仍然需要返回 $asset 变量。 【参考方案1】:

好的,正如我的 cmets 中提到的,您可以使用 beginTransaction 将其分解。 http://php.net/manual/en/pdo.begintransaction.php

完成此操作后,只需获取最后插入的 ID。您可以为此使用lastInsertId:http://php.net/manual/en/pdo.lastinsertid.php

【讨论】:

【参考方案2】:

将其分解为多个查询确实是最好的解决方案,但要回答您最初的问题:如果您想在 PHP 中获取 MySQL 变量的值,只需执行 SELECT 查询:

$asset_ID = mysql_result( mysql_query( 'SELECT @asset_ID' ) );

【讨论】:

我把你建议的命令放在我的 COMMIT;"; 行的正下方,但我仍然没有得到任何回复。 在同一个巨大的查询中?我很惊讶这完全有效,因为我认为 PHP 的 mysql 接口无论如何都会忽略第一个分号之后的所有内容(以减轻注入攻击)。也许它会返回第一个查询的结果(即“START TRANSACTION”,它实际上不返回任何内容)。

以上是关于如何将已在 MySQL 中设置的变量返回给 PHP的主要内容,如果未能解决你的问题,请参考以下文章

返回 url 发布到 PayPal 将覆盖已在 paypal 商家帐户中设置的返回 url

如何以编程方式连接到已在 Android 手机中设置的 ***

如何使用hapi.js读取已在浏览器中设置的cookie

如何获取/获取 Jenkins 管道中设置的环境变量到我们的 maven pom.xml

如何刷新我在 ServletContextListener 中设置的 servlet 上下文变量?

使用 Docker 和 PHP 从 env 文件加载环境变量