簡體   English   中英

從多個表中選擇數據從MySQL?

[英]Select data from multiple tables from mysql?

我在數據庫中有4個表,並且所有表中都有一個唯一的clientid,但是rest字段是不同的。 如果我們搜索任何客戶端ID,我們如何從任何表中獲取與搜索到的客戶端ID相對應的存儲信息。

$clientid=$_POST['client'];
$query = "SELECT * FROM 'pfs'
          JOIN 'pfssurety' 
          JOIN 'iso'
          JOIN 'incometax'
          WHERE clientid='$clientid'";
$result = mysql_query($query)or die (mysql_error());

while($row=mysql_fetch_array($result)) {
    echo $row['clientid'];
    echo $row['name'];
}

這是一個使用mysqli的實現,它可以防止注入$clientid ,其中id是一個數字柵,然后為零,因為AUTO_INCREMENT列永遠不會從0開始,所以其值為0

// as this is an int using inval will force it to be a valid whole number 
// basic SQL Injection Protection for a fixed id

$clientid = intval($_POST['client']);
if($clientid === 0){
    // it was not a valid number as an auto_increment field in mysql can never be 0
    die("invalid client");
}

$query="SELECT * FROM `pfs` 
    JOIN `pfssurety`  ON  pfssurety.clientid = pfs.clientid 
    JOIN `iso` ON  iso.clientid = pfs.clientid 
    JOIN `incometax` ON  incometax.clientid = pfs.clientid 
    WHERE pfs.clientid=$clientid";

$result= mysqi_query($query) or die("Query Failed");

while($row=mysql_fetch_array($result))
{
    echo $row['clientid'];
    echo $row['name'];
}

您打算使用反引號而不是單引號。 否則,您的表名將被視為普通字符串文字。 另外,您缺少所有JOIN子句的ON條件,因此您的查詢

SELECT * FROM 'pfs'

應該是

SELECT * FROM `pfs`

將您的查詢更改為

SELECT * FROM `pfs`
JOIN `pfssurety` ON condition
JOIN `iso` ON condition
JOIN `incometax` ON condition
WHERE clientid='$clientid'

使用JOIN,您走在正確的軌道上。 您需要指定進行聯接的公共列。

https://www.w3schools.com/sql/sql_join_left.asp

SELECT a.fieldname, i.fieldname, t.fieldname, p.fieldname FROM 'pfs' as a
LEFT JOIN 'pfssurety' as p ON p.clientid  = a.clientid 
LEFT JOIN 'iso' as i ON i.clientid  = a.clientid 
LFT JOIN 'incometax' as t ON t.clientid  = a.clientid 
WHERE a.clientid='$clientid'";

另外,您應該轉義變量以防止SQL注入。 最低限度:

a.clientid= "' . mysqli_real_escape_string($clientid) . '"';

http://php.net/manual/zh/mysqli.real-escape-string.php

也許您需要在聯接中將on設置為如下所示:

SELECT * FROM 'pfs'
JOIN 'pfssurety'  ON pfs.clientid=pfssurety.clientid
JOIN 'iso' ON pfs.clientid=iso.clientid
JOIN 'incometax' ON pfs.clientid=incometax.clientid
WHERE clientid='$clientid'

Y假定所有表都具有clientid屬性。

  • 除了使用SELECT *,您還可以使用所需的不同屬性的枚舉

您的代碼容易受到SQL注入的攻擊,切勿直接在SQL查詢中使用用戶輸入。 在您的代碼中,問題出在這里:

$clientid = $_POST['client']; // anyone could manipulate this field to inject malicious code
# ...
WHERE clientid='$clientid'";

檢查$ _POST ['client']的值為: '或1 = 1 ;會發生什么情況?

接下來,如注釋之一中所述, 停止使用不推薦使用的方法 ,例如,可以使用mysqli。 這是一個如何將mysqli與預處理語句一起使用以避免SQL注入的示例:

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$stmt = $conn->prepare('SELECT * FROM `pfs` JOIN `pfssurety` ON condition JOIN `iso` ON condition JOIN `incometax` ON condition WHERE clientid = ?');

$stmt->bind_param('i', $clientid);
$stmt->execute();
$stmt->close();
$conn->close();

預備語句是一種功能,可以高效地重復執行相同(或相似)SQL語句。

與直接執行SQL語句相比,准備好的語句具有三個主要優點:

  • 預准備語句減少了解析時間,因為對查詢的准備僅執行一次(盡管該語句執行了多次)

  • 綁定參數可最大限度地減少服務器的帶寬,因為您需要每次僅發送參數,而不發送整個查詢

  • 對於SQL注入,准備好的語句非常有用,因為以后使用不同協議傳輸的參數值不需要正確地轉義。 如果原始語句模板不是從外部輸入派生的,則不會發生SQL注入。

最后還有一件值得一提的事情,嘗試不要使用*來獲取所有列,而只是列出您需要獲取的列。 即使您需要獲取所有列,也有充分的理由說明為什么不使用*,而是列出所有列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM