求PHP从数据库中读取内容并存入文件和从文件读取数据插入数据库的代码

假设数据库里面有个表user,字段:id,name,sex,country。

我要实现的是:
第一,正向操作:
从user表中逐行读取内容存储到“abc.txt”文件中

第二,反向操作:
假定有一个"abc.txt"文件,内容和格式如下:
1 Zhangsan male China
2 Lisi male China
3 Jim male USA
.....

求这两种操作的php代码。非常感谢!!
这样吧,我把问题简化一下:数据库读取和插入就不用了。只需要:1。写入数据到abc.txt文件,2。从abc.txt中读取数据 这两种操作的代码

//第一种 
<?php
$conn = mysql_connect("主机名","用户名","密码");
mysql_select_db("数据库名",$conn);
$sql = "select * from user";
$result = mysql_query($sql);
$data="";
while($row = mysql_fetch_row($result)){
    foreach($row as $v){
        $data .=$v."|";      //加个树线隔开字段
    }
    nl2br($data);    //读完一行回车
}
file_put_contents("abc.txt",$data);


//第二种
<?php
$filename = "abc.txt";
$res = fopen($filename,"r");
while(!feof($res)){
$buffer = fgets($res);
$buffer = str_replace(' ', '|', $buffer); 
$array = explode('|', $buffer); 
foreach($array as $v){
if(strlen($v)>0){
$arr[] = $v;
}
}
}
fclose($res);
//组装数组插入数据库就可以了

追问

先赞一个,辛苦了。

请问:

    第一种里面,为啥要竖线隔开字段

    第二种里面,这种读取文件数据的方法过于复杂,而且如果数据之间的空格大于一个的话还失效(比如说Zhangsan 与 male之间有多个空格的话),能不能整行读取呢?或者其他能够考虑多个空格的方法呢?

    我使用的codeigniter,第一种生成的文件abc.txt会在什么位置呢?(这个问题你可以不回答,如果没用过codeigniter的话,呵呵)

追答

    为了隔开各字段的数据

    空格大于一个也可以的。你试一下

    CI好像听说是单入口框架,应该是CI的index.php所在的位置,也就是根目录下面生产abc.txt吧,因为所有的方法都是由index.php来执行的。不知道对不对,你试下。

追问

第一个问题里面,我按你说的写入文件之后,发现每行数据之间没有换行,所有数据都连在一起。也就是说nl2br($data)没起作用。
第二个问题,如果有多个空格的话不行,我试过。

追答nl2br($data)改成echo "\\n";
if(strlen($v)>0){ //后加的条件改成strlen($v)>0 & $v!=" "



温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-20
<?php
$mysqli = mysqli_connect("【运行MySQL的服务器】", "【登录MySQL的用户名】", "【登录MySQL的用户密码】", "【放着表的库名称】"); // 建立 PHP 程序与数据库的连接 $mysqli
// 【运行MySQL的服务器】可以是 MySQL 服务器所在的 IP 地址,如果是本机,就是 localhost
/* 下面3行检查连接是否成功了 */
if (mysqli_connect_errno()) {
printf("连接失败了,出错信息:%s\n", mysqli_connect_error());
exit();}
$query = "SELECT * from 【表的名称】"; // 构造 查表用的 SQL 语句 $query
$handle = fopen("abc.txt", "w"); // 打开 用于保存查询结果的磁盘文件 "abc.txt",得到文件句柄 $handle 以备保存结果。
if ($result = mysqli_query($mysqli, $query)) { // 读取库内指定表的记录,得到记录集 $result
while ($row = mysqli_fetch_row($result)) { // 记录集 $result 的每一行做成一个数组 $row
$L=implode ("\t", $row ); // 把数组 $row 变成一个字符串 $L,每个元素用 "\t" (Tab 键)隔开
fwrite($handle, $L."\r\n"); // 把字符串 $L 和其后的回车“\r”、换行“\n”写入到 "abc.txt" 文件中。
} // 终止 while 循环,意味着处理完了全部记录
mysqli_free_result($result); // 释放记录集 $result 所占内存
} // 对应于 if 语句,跳过对于空表的处理
mysqli_close($mysqli); // 关闭 连接 $mysqli
fclose ($handle ); // 关闭文件
?>
***************************************************************

$lines = file("abc.txt"); 语句把磁盘文件 "abc.txt" 读入内存成为 PHP 程序的 一个数组 $lines ,它的每个元素对应于 "abc.txt" 文件的每一行,你对这个数组进行处理就可以了。追问

先赞一个,辛苦了。
请问第二个,你说用file函数,能具体点么?关键是读出每行之后,如何从每行的字符串中得到单个的数值。这些数值之间是用一个或多个空格隔开的
谢谢了

追答

遍历数组数组 $lines 的每个元素(相当于 "abc.txt" 文件中的一行),每次你都得到一个字符串 $L (用“\t”分割的一组字段构成的),你用 $r = explode("\t", $L); 语句就得到一个数组 $r ,这个数组 $r 的每个元素就是用“\t”分割的一个部分——也就是把数组库中的一条记录的各个字段对应到了数组 $r的一个元素上。

另外,你把一个表的内容转换成 txt 文件的时候 用空格来做字段间分割是不科学的,比如,库表中的“姓名”这个字段,有人是单字名的,录入员可能会把他的姓和名之间插入一个空格。当你要把 txt 文件再转换成数据库表的时候,“姓名”中间的空格就会造成混乱。再者,MySQL 还有一个命令,不需要编程,只用一个命令就可以把整个 txt 文件存进一个库表里去,这个命令要求就是:txt文件的每一行对应于数据库的一条记录、在同一行内不同字段值之间用"\t"隔开。

如果你一定要“用一个或多个空格隔开”,就把我上面程序中的“\t”换成“一个或多个空格”就可以了。

追问

第一个问题,我按照你说的做了,发现写的文件abc.txt里面的数据是连在一起的,没有换行,fwrite($handle, $L."\r\n"); 貌似."\r\n"不管用

追答

看到你的追问后我在我自己的电脑上试了
那段程序一点问题都没有
因为我用的是 Linux, "\r\n" 换成 "\n"也一样