PHP + Mysql查询真正的初学者

时间:2010-07-07 17:26:49

标签: php mysql

经过多年的错误开始,我终于首先开始学习编写PHP代码。在大约10次失败之前尝试学习之后,它变得令人兴奋并最终进展顺利。

我用来学习的项目是为了工作。我正在尝试将100多个固定宽度的文本文件导入MySql数据库。

到目前为止一切顺利
我对sql感到满意,而且我正在学习一些php技巧,但我不确定如何将所有部分组合在一起。我想做的基本结构如下:

  1. 命名我要导入的文本文件
  2. 执行LOAD DATA INFILE将数据导入一个字段将其导入临时数据库
  3. 使用substring()将固定宽度文件分隔为实列
  4. 删除我不想要的行(文件标识符,小计等等)
  5. 将临时数据库中的文件添加到主数据库
  6. 删除临时数据库并重新开始
  7. 正如您在附加代码中看到的那样,thigns工作正常。它获取新文件,将其导入临时表,删除不需要的行,然后将内容移动到最终的主数据库。完善。

    问题三
    我的两个问题是:

    1. 我这样做'正确'吗?当我想在anohter之后运行一堆查询时,我是否一直在为随机变量提供mysql_query?

    2. 如何自动执行脚本循环遍历每个文件并导入它们?而不是每次都必须更改文件名并运行脚本。

    3. 最后,我将用什么PHP函数来“选择”我要导入的文件?您知道,例如将文件附加到电子邮件 - >浏览文件,上传文件,然后在其上运行脚本?

    4. 很抱歉这是一个超初学者的问题,但我很难看到所有部分是如何组合在一起的。具体来说,我想知道多个sql查询如何串在一起形成一个脚本?我在下面这样做的方式?其他一些方式?

      感谢x 100获得任何见解!

      特里

      <?php 
       // 1. Create db connection  
       $connection = mysql_connect("localhost","root","root") or die("DB connection failed:" . mysql_error());
      
       // 2. Select the database  
       $db_select = mysql_select_db("pd",$connection) or die("Couldn't select the database:" . mysql_error());
      ?> 
      
      
      
       <?php 
        // 3. Perform db query  
        // Drop table import if it already exists
        $q="DROP table IF EXISTS import";
      
      
        //4. Make new import table with just one field
        if ($newtable = mysql_query("CREATE TABLE import (main VARCHAR(700));", $connection)) {
         echo "Table import made successfully" . "<br>";
        } else{
         echo "Table import was not made" . "<br>";
         }
      
        //5. LOAD DATA INFILE 
        $load_data = mysql_query("LOAD DATA INFILE '/users/terrysutton/Desktop/importmeMay2010.txt' INTO table import;", $connection) or die("Load data failed" . mysql_error());
      
      
         //6.  Cleanup unwanted lines
        if ($cleanup = mysql_query("DELETE FROM import WHERE main LIKE '%GRAND%' OR main LIKE '%Subt%' OR main LIKE '%Subt%'  OR main LIKE '%USER%'  OR main LIKE '%DATE%'  OR main LIKE '%FOR:%' OR main LIKE '%LOCATION%' OR main LIKE '%---%' OR `main` = '' OR `main` = '';")){
         echo "Table import successfully cleaned up";
        } else{
         echo "Table import was not successfully cleaned up" . "<br>";
        }
      
      
      
        // 7. Next, make a table called "temp" to store the data before it gets imported to denominators
        $temptable = mysql_query("CREATE TABLE temp
        SELECT
        SUBSTR(main,1,10) AS 'Unit', 
        SUBSTR(main,12,18) AS 'Description', 
        SUBSTR(main,31,5) AS 'BD Days', 
        SUBSTR(main,39,4) AS 'ADM',
        SUBSTR(main,45,4) AS 'DIS', 
        SUBSTR(main,51,4) AS 'EXP', 
        SUBSTR(main,56,5) AS 'PD', 
        SUBSTR(main,100,5) AS 'YTDADM', 
        SUBSTR(main,106,5) AS 'YTDDIS', 
        SUBSTR(main,113,4) AS 'YTDEXP', 
        SUBSTR(main,118,5) AS 'YTDPD'
        FROM import;");
      
      
        // 8. Add a column for the date 
        $datecolumn = mysql_query("ALTER TABLE temp ADD Date VARCHAR(20) AFTER Unit;");
        $date = mysql_query("UPDATE temp SET Date='APR 2010';");
      
        // 8. Move data from the temp table to its final home in the main database
        // Append data in temp table to denominator table
        $append = mysql_query("INSERT INTO denominators SELECT * FROM temp;");
      
        // 9. Drop import and temp tables to start from scratch.  
        $droptables = mysql_query("DROP TABLE import, temp;");
      
        // 10. Next, rename the text file to be imported and do the whole thing over again.
      
       ?>
      
      
      <?php 
      // 5. Close connection
      mysql_close($connection);
      ?>
      

3 个答案:

答案 0 :(得分:1)

为什么不加载文件并在PHP中处理它们,并使用它在实际表中插入值?

即:

$data = file_get_contents('somefile');

// process data here, say you dump it into a 2d array like
// $insert[$rows][$cols]

// then you can insert these into the db, ie:
$query = '';
foreach ($insert as $row) { 
   $query .= "INSERT INTO table VALUES ({$row[1]}, {$row[2]}, {$row[3]});";
}
mysql_query($query);

答案 1 :(得分:1)

mysql_query设置为变量的目的是为了获取您要查询的数据。在SELECT之外的任何其他查询的情况下,它只返回true或false。

因此,在您使用if ($var = mysql...)的情况下,您根本不需要变量assing,因为函数返回true或false。

另外,我觉得做所有子字符串和数据文件处理在PHP中更适合。您可以查看该页面左侧的fopen function及相关功能。

答案 2 :(得分:1)

如果您可以访问命令,则可以直接从mysql命令行执行所有数据加载。此外,您可以通过编写shell脚本来自动执行该过程。仅仅因为你可以用PHP做某事并不意味着你应该这样做。

例如,您可以只安装PHPMyAdmin,动态创建表,然后使用mysqldump将数据库定义转储到文件中。像这样

mysqldump -u myusername -pmypassword mydatabase > mydatabase.backup.sql

稍后,您可以重新加载整个数据库

mysql -u myusername -pmypassword < mydatabase.backup.sql

很高兴你正在学习用PHP做事,但是专注于你经常用PHP做的事情,而不是用PHP做RDBMS的东西,而不是你应该在大多数时候做的事情。构建表单并处理数据。了解如何构建对象,以及为什么要这样做。走过去看看Symphony和Doctrine。了解Front Controller模式。

另外,请看PDO。使用直接的mysql_query()函数是非常“糟糕的形式”。

最后,PHP非常适合模板化,包括不同的部分,以形成一个有凝聚力的整体。练习制作左侧和顶部导航html文件。弄清楚如何在所有页面上包含这个文件,以便在任何地方显示相同的导航。

然后弄清楚如何查看页面名称等变量并突出显示您所在的导航选项卡。这些是PHP非常适合的东西。