免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6904 | 回复: 16
打印 上一主题 下一主题

我的foreach为什么多循环了一次 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-27 21:06 |只看该作者 |倒序浏览
用PHP操作Mysql

$chach是从.sql文件中读出的内容(共两条语句,创建两个表)

首先用
$chach=str_replace("\r",'',$chach);
$chach=str_replace("\n",'',$chach);

去除所有的 回车 和 换行

然后
$chach=explode(";",$chach);

把两个语句拆分开,形成数组。

最后使用foreach循环遍历

$i=0;
foreach ($chach as $query)
{
        $i++;
        echo "<hr>\$i = $i<br>";

        echo $query."<br>\n";
        if ($query == NULL)
        {
                echo "空<br>";
        }
        //mysql_query($query) or die ("error<br>");
echo "<hr>";
}


最后我发现输出的$i居然循环到了3
或者说循环执行了三次!!??

并且最后一次为 “空”

请问为什么会多循环这一次?

论坛徽章:
0
2 [报告]
发表于 2007-09-27 21:16 |只看该作者
问题在


  1. $chach=explode(";",$chach);
复制代码


下面的 SQL:


  1. SELECT 1+1 FROM system;
复制代码


explode 之后会有两个 item。

论坛徽章:
0
3 [报告]
发表于 2007-09-27 21:22 |只看该作者
最后一个分号的问题
你的操作还有一点不妥就是,可能查询之间存在空格现象。
一般在循环体开始处判断一下

if (trim($query) == '') continue;

论坛徽章:
0
4 [报告]
发表于 2007-09-27 21:52 |只看该作者
是最后一个分号后面被,不管有没有东西都算作一项了,是么??

如果这样,以分号开头是不是也会把分号前面算是一项呢??

我测试下!

论坛徽章:
0
5 [报告]
发表于 2007-09-27 21:54 |只看该作者
实验结果,

是这样的

谢谢各位

to:super_fire
为什么需要用 '' 判断,而不能用NULL判断??
我是用NULL判断了一下

论坛徽章:
0
6 [报告]
发表于 2007-09-27 22:02 |只看该作者
原帖由 net_robber 于 2007-9-27 23:52 发表
是最后一个分号后面被,不管有没有东西都算作一项了,是么??

如果这样,以分号开头是不是也会把分号前面算是一项呢??

我测试下!


你会这样说是没有理解 explode() 的作用。可以理解为 explode 就是把字符串切开,参数就是切的地方。

另外上面一位的回复是有 trim() 的,和你的不只是 NULL 和 "" 的区别。

另外你这个做法也有些奇怪,因为 mysql_query() 是可以执行整个 SQL 文件的内容的,即使 SQL 文件的内容包含多个语句。

EDIT:mysql extension 不能执行多条语句,mysqli 才可以。

[ 本帖最后由 dz902 于 2007-9-28 15:56 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-09-27 22:15 |只看该作者
原帖由 net_robber 于 2007-9-27 21:54 发表
实验结果,

是这样的

谢谢各位

to:super_fire
为什么需要用 '' 判断,而不能用NULL判断??
我是用NULL判断了一下



用''和NULL是一样的效果

论坛徽章:
0
8 [报告]
发表于 2007-09-27 22:44 |只看该作者
原帖由 net_robber 于 2007-9-27 21:54 发表
实验结果,

是这样的

谢谢各位

to:super_fire
为什么需要用 '' 判断,而不能用NULL判断??
我是用NULL判断了一下


对于 $var = '' 的情况,用
empty($var)
$var == NULL
!$var
都是可以的。
但我本人更习惯根据变量类型写让人容易理解的语句。
字符串就用 $var == '';
布尔值就用  !$var;
NULL/empty/isset  我只用来检测变量是否已经赋值。

论坛徽章:
0
9 [报告]
发表于 2007-09-27 22:47 |只看该作者
原帖由 dz902 于 2007-9-27 22:02 发表


另外你这个做法也有些奇怪 ... mysql_query()...


这位朋友,你确定 mysql_query 可以一次性查询多个语句吗?
我以前试过,没成功,也没见别人这么用过,也没见手册这么写过。

如果可以的话,那函数返回的结果是什么? mysql_query 可是根据SQL语句类型来返回不同类型的变量的。

[ 本帖最后由 super_fire 于 2007-9-28 02:13 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-09-28 09:59 |只看该作者
$chach=explode(";",$chach);

  这里的$chach是一个数组了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP