在单个查询中更新两个表

时间:2015-11-22 08:25:18

标签: php mysql sql

我在sql中有两个表,第一个表用于帐户,而第二个表用于推荐。我试图在单个查询中更新两个表。如果该帐户已经有推荐信,则更新成功,但如果该帐户尚未提供推荐信,则无法更新。如何解决这个问题以及我的代码以进行更新....

if(!$update=mysql_query(
                "UPDATE
                     tblapplicant,
                     tbltestimonial
                 SET
                     tblapplicant.ImagePath='".$name."',
                     tbltestimonial.pic = '".$name."'
                 WHERE
                     tblapplicant.appid=tbltestimonial.appid"
            )
    )

3 个答案:

答案 0 :(得分:1)

1)您正在使用数据库,它无法使用插入两个不同表中的相同数据。

2)一位绅士也提到停止使用MySQL ...下面是一些参考代码。假设你正在使用php。

3)如果要使用单个查询来更新具有相同推荐信息的2个表。使用存储过程来更新它们。

4)在这个查询中,这些帐户在哪个点互连?如果这个系统处于测试版或测试阶段,我对此感到好奇吗?

如果您的“Where”条件没有匹配特定记录,则会更新具有匹配ID的每条记录。在您添加其他条件(例如username = ....)或特定于某人或特定行集的条件之前,强烈建议不要这样做。

**我强烈建议您发布您正在使用的表格以及您希望获得最佳建议的结果。 **

真的不能给你一个很好的咨询,你可以在靠近胸部玩整个概述。使用这个简单的Jane而没有进一步详细说明你要求的是我的朋友自己的风险。

include / dbconnect.php可选推荐更新

<?php
if (isset($mysqli)){
    unset($mysqli);
}
define("HOST", "yo.ur.ip.addr");     // The host you want to connect to.
define("USER", "myfunctionalaccount");    // The database username. 
define("PASSWORD", "superdoopersecurepassword!");    // The database password. 
define("DATABASE", "thegoods");
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
if ( $mysqli->connect_error ) {
    die('Connect Error: ' . $mysqli->connect_error);
}
?>

functions.php&lt; - 不应该被称为函数,如果它将成为你的表单响应

<?php
// SHOULD BE SOME MASSIVE LOGIC UP HERE FOR FORM DATA DECISIONING
include_once "include/dbconnect.php";
$name = addslashes($_FILES['image']['name']);
$image = mysql_real_escape_string(addslashes(file_get_contents($_FILES['image']['tmp_name']))); 
if ($stmt = $mysqli->prepare("CALL UpdateTestimonials(?,?,?)"){
        $stmt->bind_param($name, $image, $userid);
        $stmt->execute();
        // optional to show affected rows
        $stmt->affected_rows
        //
        // use if you want to return values from DB
        // $stmt->bind_result($result);
        // $stmt->fetch;            
}
$stmt->close
?>

MySQL构建存储过程 - fyi;定义者是可选的。 Definer将允许您运行查询,由于此类查询的安全性,只有提升的权限才能访问。您可以使用创建过程w / o definer参数。 dT只是数据类型的缩写。你会把varchar或int ......等等。

use 'database';
DROP procedure if exists 'UpdateTestimonials';
DELIMITER $$
use 'UpdateTestimonials' $$
CREATE DEFINER='user'@'HOSTNAME/LOCALHOST/%' PROCEDURE 'mynewprocedure' (IN varINPUT varchar, IN varIMG blob, IN varAppID int)
BEGIN
    UPDATE tblapplicant 
    SET imagepath = varINPUT,
        pic       = LOAD_FILE(varIMG)
    WHERE appid = varAppID
END $$
DELIMITER;

答案 1 :(得分:0)

使用LEFT JOIN:

if (!$update = mysql_query(
            "UPDATE
                 tblapplicant 
                 LEFT JOIN tbltestimonial ON tblapplicant.appid = tbltestimonial.appid
             SET
                 tblapplicant.ImagePath = '" . $name . "',
                 tbltestimonial.pic = '" . $name . "'"
        )
)

此外,如果您需要一些额外的过滤器,请将它们添加到LEFT JOIN条件

答案 2 :(得分:0)

您可以尝试使用交易。 BTW也请使用预准备语句来防止SQL注入攻击。

<?php
  // prefer mysqli over mysql. It is the more modern library.
  $db = new mysqli("example.com", "user", "password", "database");

  $db->autocommit(false); // begin a new transaction

  // prepare statements
  $update_applicant = 
    $db->prepare("UPDATE tblapplicant
                  SET    tblapplicant.ImagePath = ?"));
  $update_applicant->bind_param("s", $name));
  $update_applicant->execute();

  $update_testimonial = 
    $db->prepare("UPDATE tbltestimonial
                  SET    tbltestimonial.pic = ?"));
  $update_testimonial->bind_param("s", $name))
  $update_testimonial->execute();

  $db->commit(); // finish the whole transaction as successful,
                 // when everything has succeeded.
?>

当然,这不会产生任何不存在的推荐。它只会更新那些。如果要在tbltestimonial中插入新条目,请在事务中使用INSERT语句明确地执行此操作。

MySQL不完全支持交易。这些表必须使用可以处理它们的表类型,例如innodb。在这种情况下,交易将确保其他所有人都看到交易中的所有更改,或者没有。

在许多情况下,事务允许您执行一组简单的步骤,否则将需要复杂的单个查询,或者在没有事务的情况下是不可能的。

替代解决方案

另一种方法当然是更新触发器。在数据库中创建一个触发器,每当触发时触发tblapplicant已更新,并相应地更新tbltestimonial。然后,您不必在应用程序代码中关注它。