[英]update two table in single query
我在 sql 中有兩個表,第一個表用於帳戶,而第二個表用於推薦。 我正在嘗試在單個查詢中更新兩個表。 如果帳戶已經有推薦書,則更新成功,但如果帳戶還沒有推薦書,則更新失敗。我該如何解決這個問題,這是我的更新代碼....
if(!$update=mysql_query(
"UPDATE
tblapplicant,
tbltestimonial
SET
tblapplicant.ImagePath='".$name."',
tbltestimonial.pic = '".$name."'
WHERE
tblapplicant.appid=tbltestimonial.appid"
)
)
1)您正在使用數據庫,它違背了將相同數據插入到兩個不同表中的目的。
2) 一位先生還提到停止使用 MySQL ... 這里有一些參考代碼供您使用。 假設您使用的是 php。
3)如果您想使用單個查詢根據推薦更新具有相同信息的 2 個表。 使用存儲過程來更新它們。
4)這些賬戶在這個查詢中的哪個點是相互關聯的? 我有點好奇這個系統是處於測試階段還是測試階段?
如果您的“Where”條件不匹配特定記錄,這將更新每個具有匹配 ID 的記錄。 在您添加更多條件(例如 username = .... 或特定於某人或一組特定行的條件)之前,強烈不建議這樣做。
**我強烈建議您發布您正在使用的表格以及您希望獲得的最佳建議的結果。 **
無法真正與您在靠近胸部播放整個概述時進行很好的協商。 我的朋友,在沒有進一步詳細說明您要求的內容的情況下使用這個簡單的簡是您自己的風險。
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 <-- 不應該被稱為函數,如果它是你的表單響應
<?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構建存儲過程——僅供參考; 定義器是可選的。 由於此類查詢的安全性,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;
使用左連接:
if (!$update = mysql_query(
"UPDATE
tblapplicant
LEFT JOIN tbltestimonial ON tblapplicant.appid = tbltestimonial.appid
SET
tblapplicant.ImagePath = '" . $name . "',
tbltestimonial.pic = '" . $name . "'"
)
)
此外,如果您需要一些額外的過濾器用於 tbltestimonial,請將它們添加到 LEFT JOIN 條件中
您可以嘗試進行交易。 順便說一句,還請使用准備好的語句來防止 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
語句顯式INSERT
此操作。
MySQL 不完全支持事務。 表必須使用可以處理它們的表類型,例如innodb
。 在這種情況下,交易將確保其他人要么看到交易中的所有更改,要么什么都不看到。
在許多情況下,事務允許您執行一組簡單的步驟,否則將需要復雜的單個查詢,或者根本沒有事務就不可能。
替代方案
當然,另一種方法是更新觸發器。 在您的數據庫中創建一個觸發器,它會在例如tblapplicant
更新並相應地更新tbltestimonial
。 那么您不必在應用程序代碼中關心它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.