【问题标题】:Reference two SQL databases with a Join via PHP通过 PHP 使用 Join 引用两个 SQL 数据库
【发布时间】:2015-12-09 15:38:39
【问题描述】:

我写了一个在 phpmyadmin 中工作的 SQL 语句。我在同一台服务器上有两个数据库,我使用 INNERJOIN 连接它们并得到正确的结果。我正在用 php 构建它,到目前为止已经做了一些正常的查询并得到了正确的结果。我的数据库有一个包含,它连接到一个数据库,现在我想连接到两个,我不确定我如何在我的 php sql 语句中引用它。有人可以帮忙吗?

我有这个。

<?php
    error_reporting(0);
    include './includes/opendb.php';
    extract($_POST);

    $sql1 = mysql_query("SELECT f_clients.CLIENT_COMPANY,   vtmastertrail.consultant, f_clients.CLIENT_CODE, vtcards.description, vtmastertrail.inspdate_start, vtmastertrail.inspdate_end, vtcards.typeofcard, vtcards.colour, vtcards.frequency, vtcards.priorityon, vtmastertrail.islive, f_clients.CLIENT_DEFAULTINSPECTIONSELL
FROM `f_clients`
INNER JOIN tcards.vtcards ON tcards.vtcards.client_code = f_clients.CLIENT_CODE
INNER JOIN tcards.vtmastertrail ON tcards.vtmastertrail.card_id = tcards.vtcards.id
WHERE tcards.vtmastertrail.consultant = '".$con_name."'
AND tcards.vtmastertrail.inspdate_start >= '".$from_date."'
AND tcards.vtmastertrail.inspdate_start <= '".$to_date."'");

    echo "<table border='1' align='center'>
      <tr>
        <th>Consultant</th>
        <th>Client Code</th>
        <th>Client</th>
        <th>Address</th>
        <th>Inspection Start Date</th>
        <th>Inspection End Date</th>
        <th>Type Of T-Card</th>
        <th>T-Card Colour</th>
        <th>Frequency</th>
        <th>Priority</th>
        <th>Report Sent Out</th>
        <th>Cost</th>
     </tr>";         

    while($row = mysql_fetch_array($sql1))
    {
        echo "<tr>";
        echo "<td>" . $row['consultant'] . "</td>";
        echo "<td>" . $row['client_code'] . "</td>";
        echo "<td>" . $row['title'] . "</td>";
        echo "<td>" . $row['description'] . "</td>";
        echo "<td>" . $row['inspdate_start'] . "</td>";
        echo "<td>" . $row['inspdate_end'] . "</td>";
        echo "<td>" . $row['typeofcard'] . "</td>";
        echo "<td>" . $row['colour'] . "</td>";
        echo "<td>" . $row['frequency'] . "</td>";
        echo "<td>" . ($row['priorityon'] ? 'Yes' : 'No') . "</td>";
        echo "<td>" . ($row['signedoff'] ? 'Yes' : 'No') . "</td>";
        echo "<td>" . $row['CLIENT_DEFAULTINSPECTIONSELL'] . "</td>";
        echo "</tr>";
    }

    echo "</table>";
}

我基本上没有从这个搜索中得到任何结果。

这是我的数据库文件。

<?php
    // ** database connection string
    $conn = mysql_connect("localhost", "#####", "########") or die ('I cannot connect to the database because: ' . mysql_error());

    // ** Tcards database
    mysql_select_db ("tcards");

我已更改隐藏凭据。我有另一个名为“test”的数据库,它是 f_clients 表所在的位置。这是在同一台服务器上,并具有相同的登录凭据。谁能帮帮我?

【问题讨论】:

  • 肯定想要extract($_POST);。这相当于从 PHP 中删除的“注册全局变量”,因为它存在巨大的安全风险。此外,您不应该在没有正确转义的情况下将任何数据放入 SQL 查询中。
  • 谢谢,我似乎已经修复了它,我的查询中的错误似乎在 phpmyadmin 中有效,但在 php.ini 中无效。感谢您对提取功能的建议。用什么来代替它?
  • 您应该直接使用$POST var,而不是按照您的方式将值放入 SQL 查询中,而是使用准备语句。看看这个教程:markonphp.com/mysqli-select-prepared-statements

标签: php mysql inner-join


【解决方案1】:

如果您打算从两个单独的数据库中进行选择,则无需调用 mysql_select_db。

您的查询需要使用完全限定的名称(即“test.f_clients.CLIENT_COMPANY”等)。我认为只要您完全限定数据库名称,您的 ON 子句就可以了。

注意 MySQL 函数(mysql_query 等)已被弃用;请考虑切换到 MySQLi 或 PDO。 MySQLi 是一个简单的切换。

还要注意 Ian 上面关于提取 POST 数组和转义查询数据的所有评论。您必须安全编码,除非这是某处防火墙后面的公司 Intranet,即使那样您也不能保证它不会被利用....

【讨论】:

  • 感谢您的建议。我会考虑将其更改为 MYSQLi。
【解决方案2】:

您可以做的一件事是为两个数据库添加相同的用户和密码。或者您可以使用视图来克服您的问题。在实践中,我成功地向两个数据库添加了相同的用户名和密码。如果你喜欢尝试使用易于使用数据库的“mysql workbench”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多