【问题标题】:Sharing table data with each other彼此共享表数据
【发布时间】:2013-08-26 15:18:00
【问题描述】:

您好,我是一名电脑和笔记本电脑维修人员,想建立一个离线数据库站点,我可以在其中输入有关维修、客户和发票的详细信息。 我对sqli和php有非常基本的了解,因为我才刚刚开始尝试学习它。

目前我的数据库中有 3 个表,它们没有相互链接。我使用 3 个表单向其中提交数据。

客户

Id – name – surname – phone – address

维修

Id – name – surname – phone – address – unit – date – price

发票

Id - paidstatus – date paid - name – surname – phone – address- unit – date – price

由于我缺乏知识,我将数据显示在 3 个不同的页面上

Clients.php
Repairs.php
Invoices.php

这对我来说不是理想的解决方案,但这样做是因为我的知识非常基础。 例如,当我去我的表单添加一个新的修复时,我想从客户表中提取信息并使用以下详细信息:姓名 - 姓氏 - 电话 - 地址 然后在发票上,我喜欢从其他表中调用数据。

我认为我所追求的是所谓的数据库规范化,我有一些链接,但在一些问题上我是在追求某人的专业知识......

这是我从上面的表格中提取数据的当前方式,我使用了示例,因此代码可能不会反映表格的名称或行。

  <?php
    //include database connection
    include 'db_connect.php';

    //query all records from the database
    $query = "select * from repair_jobs";

    //execute the query
    $result = $mysqli->query( $query );

    //get number of rows returned
    $num_results = $result->num_rows;

    //this will link us to our add.php to create new record
    if( $num_results > 0){ //it means there's already a database record

        //start table
        //creating our table heading
        echo " <table class='table_basic'>";
        echo "<thead><tr>";
            echo "<th>Job #</th>";
            echo "<th>Name Of Unit</th>";
            echo "<th>Client</th>";
            echo "<th>Estimated Value</th>";
        echo "</thead></tr><tbody><tr>";

        //loop to show each records
        while( $row = $result->fetch_assoc() ){
                //extract row
                //this will make $row['firstname'] to
                //just $firstname only
                extract($row);

                //creating new table row per record
                echo "<tr>";
                    echo "<td width='40px'><a href='rdetails.php?id={$id}'># {$id}</a></td>";
                    echo "<td>{$type}</td>";
                    echo "<td>{$notes}</td>";
    echo '<td align="center"><span class="badge badge-success">£';
    include('repairest.php');
    echo '</span></td>';

                                    echo "</td>";
                echo "";
        }

        echo "</tr></table>";//end table

    }else{
        //if database table is empty
        echo "No records found.";
    }

    //disconnect from database
    $result->free();
    $mysqli->close();

    ?>

使用规范化提取信息会有什么不同?任何人都可以发布一个简单教程的链接,也许可以下载教程源文件?

另外,输入数据的表单会有什么不同?


更新


关于米娅的回答

如何通过 sql 创建和连接表?我在 cmets 字段中看到了您在此问题下链接的页面上的示例,但您能告诉我加入此的方法吗

一对一和多个。

我的想法是对的,当我添加新的维修时,我只会使用我的表格来添加 单位-日期-价格 但是如果没有创建客户端怎么办?还是必须先做客户?

类似

客户:旧的(下拉)或新的(按钮)(可能需要一个 sn-p 的代码,所以我可以做一些研究)

然后我会输入维修数据。

发票可以生成,因为所有需要的信息都可以从维修表中获得,并且

【问题讨论】:

  • 这是一个开始的好地方:intro to normalization
  • 感谢您的评论和链接,我已经开始浏览了。在我的情况下,他们所说的 ISBN 表将是我的联系表。有没有办法获取源文件以便我可以在工作环境中看到它?这样我学得更好:)

标签: php mysqli


【解决方案1】:
<a href = "Page.php?View=Invoices">View Invoices</a>
<a href = "Page.php?View=Repairs">View Repairs</a>
<a href = "Page.php?View=Clients">View Clients</a>



<?php

  if (isset($_GET['View'])){

    //query all records from the database
    $query = "select * from ".$mysqli->real_escape_string($_GET['View']);

    //execute the query
    $result = $mysqli->query( $query );
  }

与此类似的方法会产生奇迹,并允许您将视图保持在一个页面上。如果您的数据库设置大致相同,在个别情况下,您应该根据$_GET['View']; 的结果验证视图如果:

if ($_GET['View'] === "Test_1"){
  echo "Validate as Clients";
}elseif ($_GET['View'] === "Test_2"){
 echo "Validate as Repairs";
}elseif ($_GET['View'] === "Test_3"){
 echo "Validate as Invoices";
}

这是一个演示,您应该将此代码/发现调整到您自己的环境中

【讨论】:

  • 谢谢你的回答,我明白你在说什么,我使用这种方法会比我目前在不同页面上使用的方法更好
【解决方案2】:

我找不到有源代码的,但是here is one with some diagrams

关键是您不想跨表重复数据,因此例如,您可以将表修改为如下所示:

客户

Id – name – surname – phone – address

维修

Id – client_id – unit – date – price

发票

Id - repair_id - paidstatus – date paid
  1. 客户到维修是一对多的关系,即一个客户可以有很多维修,而一个维修只能有一个客户。
  2. 客户到发票是通过维修的一对多关系,即一个客户可以有多个发票,而一个发票只能有一个客户。
  3. 发票维修是一对一的,我认为这可能是个问题,因为将多次维修绑定到一张发票​​可能很有意义,但这是一个很好的起点。

您始终可以从发票开始,并在修复发票时使用外键,而不是客户。这在业务逻辑方面有点互换,但我认为它会给你更大的灵活性:

客户

Id – name – surname – phone – address

发票

Id - client_id - paidstatus – date paid

维修

Id – invoice_id – unit – date – price

更新

好的,假设您决定继续使用您的原始模型,而不是我提到的修改版本。您将像现在一样创建每个表,并且您只需确保 repairs 中的 client_id 与客户端中的 id 数据类型相同。

然后您可以使用 JOIN (Here is an SO answer that talks about SQL JOINs) 运行单个查询以提取数据:

# all the data
SELECT * FROM invoices i JOIN repairs r ON i.repair_id = r.id JOIN clients c ON r.client_id = c.id

# all the data for a specific customer
SELECT * FROM invoices i JOIN repairs r ON i.repair_id = r.id WHERE r.client_id = <id goes here>

# Also, if JOINs seem intimidating, you can reference multiple tables
# and link them all together in a where clause
SELECT * FROM invoices i, repairs r, clients c WHERE i.repair_id = r.id AND r.client_id = c.id

# But you don't always need to get all of the data at once.  
# It makes a lot of sense to grab only what you need and create links to detail pages.
# So grab all of the unpaid invoices, and provide a link to a page that write that
# shows the client and repair details associated with that invoice
SELECT * FROM invoices i WHERE i.paidstatus='unpaid'

现在您仍然需要先创建客户端,但是在创建修复表单中,您将有一个选择框,其中包含选项,其中客户端表中的 id 作为值。

//query all records from the database
$query = "select id, name, surname from clients";

//execute the query
$result = $mysqli->query( $query );

echo("<select name='client_id'>");
while( $row = $result->fetch_assoc() ){
   echo("<option value='" . $row['id'] . "'>" . $row['name'] . " " . $row['surname'] . "</option>";
}
echo("</select>");

是的,您可以在修复表单中添加新的客户字段,这只会增加数据库插入的复杂性,所以这取决于您。

这里的基本思想是,您从表中获取您希望其他表引用的数据的 id。这样,如果 client_A 更改了他们的电话号码,您只需更改一处即可。

【讨论】:

  • 我已经阅读了您的答案,并且很有道理。但我已经更新了问题。
  • 感谢您提供如此深入的回答。我已经设法让第二部分工作,但需要一些关于如何显示客户端数据的帮助
猜你喜欢
  • 2019-07-27
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2021-04-21
相关资源
最近更新 更多