Php 从mysql的多个表中选择数据?

Php 从mysql的多个表中选择数据?,php,mysql,sql,Php,Mysql,Sql,我在数据库中有4个表,唯一的clientid在所有表中都是通用的,但rest字段是不同的。如果我们搜索任何客户机id,我们如何从any表中获取与搜索到的客户机id对应的存储信息 $clientid=$_POST['client']; $query = "SELECT * FROM 'pfs' JOIN 'pfssurety' JOIN 'iso' JOIN 'incometax' WHERE clientid='$

我在数据库中有4个表,唯一的clientid在所有表中都是通用的,但rest字段是不同的。如果我们搜索任何客户机id,我们如何从any表中获取与搜索到的客户机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'];
}

你想用backtique而不是单引号。否则,表名将被视为普通字符串文字。此外,您缺少所有JOIN子句的条件,因此您的查询

SELECT * FROM 'pfs'
实际上应该是

SELECT * FROM `pfs`
将您的查询更改为

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

使用“联接”时,您走在正确的轨道上。您需要指定应在其上进行联接的公共列

此外,还应转义变量以防止SQL注入。至少:

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

也许你需要在你的加入中设置如下:

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'";
检查$\u POST['client']的值为:'或1=1时会发生什么

接下来,正如其中一条评论中提到的,停止使用不推荐的方法,例如,您可以使用mysqli。下面是一个如何将mysqli与准备好的语句一起使用以避免SQL注入的示例:

预处理语句是一种功能,用于高效地重复执行相同或类似的SQL语句

与直接执行SQL语句相比,预处理语句有三个主要优点:

Prepared语句减少了解析时间,因为尽管语句执行了多次,但对查询的准备只执行了一次

绑定参数最小化服务器的带宽,因为您每次只需要发送参数,而不需要发送整个查询

准备好的语句对于SQL注入非常有用,因为稍后使用不同协议传输的参数值不需要正确转义。如果原始语句模板不是从外部输入派生的,则无法进行SQL注入


最后,还有一件值得一提的事情,试着不要使用*获取所有列,而只是列出需要获取的列。即使您需要获取所有列,也有很好的理由不使用*,而是列出所有列

这是一个使用mysqli的实现,它可以防止$clientid的注入,其中id是一个数字,然后是零,因为自动增量列永远不会有一个从1开始的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'];
}

使用不推荐使用的mysql_*API时,您会错过第二个子句。使用mysqli_*或pdo这将不起作用,因为当您使用JOIN时,您需要使用ON子句和mysql_查询,mysql_fetch_数组将不起作用您需要使用mysqli_*。您的代码容易受到SQL注入的攻击,请查看我的答案,了解如何防止这种情况发生的简单示例。另外,请阅读什么是SQL注入以及如何防止它。为什么你离开了连接?他可能想要null。在注入上添加了一行,我发誓每个SQL问题都有未替换的变量。关于连接,这是一个很好的观点。对于大多数连接,左连接是我的习惯。这是如何阻止SQL注入的?您仍然在使用用户输入直接进入查询,您应该使用准备好的语句;intval将把它变成一个int,不管怎样,所以如果它有任何无数字字符,它将导致0去学习php…我错过了intval部分,对不起。尽管如此,在我看来,你还是应该使用准备好的语句,因为这是你想使用它们的主要原因之一,在这里阅读更多关于它们的内容:是的,我知道,但我认为这可能有点复杂,因为OP使用的是mysql,而不是mysqli,更不用说mysqli::objective或PDO,然后再尝试找出为什么他发布的$u['clientid']由于数组值未通过引用传递,因此会出现问题$stmt->bind_param'i',$clientid之间缺少$clientid的集合;和$stmt->execute;
$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();
// 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'];
}