首页 > 编程技术 > php

php获取textarea的值,并处理回车(换行)

发布时间:2016-11-25 15:38

在html表单中textarea中我们按回车与换行都是一些asc 或特殊的字符的我们是看不到了,如果不进行转换输出文字是没的排版的,下面本文章就此问题给各位总结一些例子吧。

php获取textarea的值是十分简单的 textarea回车换行为 \r\n 下面看例子

HTML代码:

 代码如下 复制代码

<Textarea name=”test” rows=”3″ cols=”20″ id=”test”></textarea>

PHP代码:

 代码如下 复制代码

$str=$_GET['test'];
echo $str.’<br />’;
$arr=explode(“\n”,$str);
print_r($arr);
echo count($arr).’<br />’;//回车数
$str1=nl2br($str);//回车换成换行
echo $str1;

所有代码:

 代码如下 复制代码

<html>
<head>
<title></title>
</head>
<body>
<form action=”">
<textarea name=”test”></textarea>
<input type=”submit”  />
</form>
<?php
$str=$_GET['test'];
echo $str.’<br />’;
$arr=explode(“\n”,$str);
print_r($arr);
echo count($arr).’<br />’;//回车数
$str1=nl2br($str);//回车换成换行默认函数
echo $str1;
?>

</body>
</html>

看一段dz论坛中例子

不多说了,上代码:

 代码如下 复制代码
$names = preg_split('/\r\n/',$_POST['textarea']);
foreach($names as $name){
    // todo something eg: echo $name;
}

取值很简单,那么赋值呢,在textarea中输出换行符可没那么简单

 

 代码如下 复制代码
$vals = get_from_mydb();
$tmp = '';
foreach($vals as $val){
    $tmp .= $val.'&#13;&#10;';
}
“&#13;”和”&#10;”是什么意思

相信大家都看到了,其实textarea中的回车变成字符就成”\n”了,所以php处理textarea中的回车其实就是处理字符中的”\n”.

下文来看看php session 同ip不同端口的多个网站session冲突的解决办法,希望文章能帮助到大家。

发现原因:
在局域网内使用IP加端口的访问方式搭了两个相同程序的站,结果发现用户在一个站下登录后,在另一个站也同时登录了,在一个退出后,另一个站也同时退出了。看了下程序发现两个站都是使用纯session方式记录登录状态,Cookie中只保存有PHPSESSID这个数据,而且由于使用的IP加端口形式,发现他们两个站的Cookie作用域是相同的,都是属于该服务器IP,这也就是导致这个问题的原因了。
解决方法:
/*————————————————-以下是废话————————————————-*/
1.把程序改为使用cookie记录使用的,两个站使用不同的cookie前后缀? 还是算了,懒的改。
2.由于服务器上有DNS服务,给这两个站绑定两个不同的域名,然后给局域网内的所有用户修改DNS地址?我去,那么多台电脑,只能我一个个去改,也不符合我们这种技术?诺姆绺癜 ! 而且还是懒。。。算了。
3.给服务器增加一个IP,给两个站绑定到不同的IP上去,局域网那么多的IP,闲着也是闲。方法可以行,试着弄了下又发现问题了:直接在本地连接中给这个网卡加一个IP,发现在不同的网关中,会提示MAC地址冲突。由于不太懂网络搭建,想添加一个虚拟网卡, 给虚拟网卡分配一个IP不就行了?两个网卡两个MAC应该没问题了吧,试了下发现虚拟的东西只能在本台计算机上使用。其它计算机是ping不通无法使用的。。 虽然后来又发现该服务器有两个物理网卡,只是第二个网卡没线插了也没权限去机房搞网线插。。还是算了。
4.最后还是通过程序上实现了。。。
/*————————————————-以上是废话————————————————-*/
在程序的common文件或是其它公用文件中加入一句php代码,如下:
ini_set(‘session.name’, ‘PHPSESSID_RS’);
当然 第二个参数就是session在保存到cookie时使用的名字,你可以自己设置自己喜欢的。。。
就是因为所有程序使用的session名都是在php.ini中设置的默认名称PHPSESSID, 所以 如果同域(同IP不同端口)下的网站之间使用session时会出现共用冲突情况。现在两套程序使用不同的session.name来保存sessionid,所以就不会产生session的冲突问题了。
问题解决!
PS:马蛋, 我的键盘又有两个键坏了。。问一句,为什么键盘会出现有的键按了没反应,即使在安全模式(顿号)PE系统中,而且该现象会发展,发展到这个键所在的一列都会挨个没反应,然后发展下一列。。最后发展成抛弃键盘直接使用虚拟桌面键盘的地步。。。

补充一篇:java解决办法

 一个服务器上搭建了多个tomcat或者weblogic,端口不一样,同时启动访问时session丢失。如:A,B两个服务,在浏览器中登录访问A后,当前打开的浏览器上在开一个选项卡访问B服务后,回过来点击访问A时session丢失,需要重新登录A才可以访问。经过资料查找,发现问题是因为:IP相同认为是同一个域,接收了B的set-cookie指令,把对应的cookie内容覆盖了,其中包括jsessionid,造成A的session丢失。 如果IP不同,则不会发生这个问题。IP相同的两个session对应的cookie是一样的,而不幸的是sessionID就保存在cookie中,这样先访问A,再访问B的时候,B的sessionid会覆盖A的sessionid。这个事情没办法解决,所以你不要搞两个端口,最好是搞两个IP。原来都是cookie惹的祸,它不会区分端口,造成这多个站点不断的后来的覆盖前面的,从而造成session的丢失。
        解决方法:
方法1:将不同的多个应用服务在不同的虚拟主机中,或者映射不同的IP进行部署。
方法2:对应tomcat服务处理方式:修改coocie的名称保证cookie不重复,即jsessionid的不重称,保证ip相同下sessioncookiename域名不同。
           1、tomcat5修改方法
在启动项中增加org.apache.catalina.SESSION_COOKIE_NAME参数
linux
JAVA_OPTS=’-Dorg.apache.catalina.SESSION_COOKIE_NAME=yousessionname‘
win
set JAVA_OPTS=”-Dorg.apache.catalina.SESSION_COOKIE_NAME=yousessionname“
           2、tomcat6和tomcat7修改方法相同
       tomcat增加参数对所有Context生效,影响甚大,所以到以后的版本可以就仅针对Context设置了
        在Context容器标签上增加sessionCookieName参数
<Context path=”/” docBase=”webapp” reloadable=”false”sessionCookieName=”yoursessionname”></Context>
          3、weblogic修改方法
          设置各个应用使用不同的cookie-name。
         weblogic的设置(设置不同的cookie-name):

         请在WEB-INFWeblogic.xml添加如下代码

                  <session-descriptor>      

                             <cookie-name>JSESSIONID1</cookie-name>  

                  </session-descriptor> 

session共享问题原因于自己几个不同站之间需要实现session共享了,下面小编整理了一些session共享文章,希望对大家有帮助。

使用lvs或者nginx进行web的负载均衡时,一般都会遇到session共享的问题,因为一般PHP网站的session是以文件的形式存储于服务器本地的硬盘上。多个服务器进行负载均衡时,将会出现用户请求被分配到其他服务器上后session丢失的问题。解决方案主要有以下几个思路。

1.将session存储在共享的设备上,例如NFS等文件系统上

这种解决方案很容易实现,无需做特殊设置,将nfs目录mount至php的session存储目录即可。缺点是NFS依托于复杂的安全机制和文件系统,因此并发效率不高,尤其对于session这类高并发读写的小文件, 会由于共享目录服务器的io-wait过高,最终拖累前端WEB应用程序的执行效率。

2. 基于数据库的Session共享

首选当然是大名鼎鼎的Mysql数据库,并且建议使用内存表Heap,提高session操作的读写效率。这个方案的实用性比较强,相信大家普遍在使用,它的缺点在于session的并发读写能力取决于Mysql数据库的性能,同时需要自己实现session淘汰逻辑,以便定时从数据表中更新、删除session记录,当并发过高时容易出现表锁,虽然我们可以选择行级锁的表引擎,但不得不否认使用数据库存储Session还是有些杀鸡用牛刀的架势

3. 基于Memcache的Session共享

Memcache由于是一款基于Libevent多路异步I/O技术的内存共享系统,简单的Key + Value数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势。
另外值得一提的是Memcache的内存hash表所特有的Expires数据过期淘汰机制,正好和Session的过期机制不谋而合,降低了过期Session数据删除的代码复杂度,对比“基于数据库的存储方案”,仅这块逻辑就给数据表产生巨大的查询压力
 
1.首先安装memcache,以及memcache在php中的扩展
2.修改php.ini文件

 代码如下 复制代码

session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211″

使用多个 memcached server 时用逗号”,”隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval” 等等,类似这样的:”tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2″

3.大功告成,重启apache和memcache看看phpinfo里的session配置是不是变成了memcache了。
4.自己的程序完全不用修改,系统已经自己去找memcache来做他的session宿主啦。
PS:如果不想整台服务器全局都是用memcache的话也可以用如下两种方法:

 代码如下 复制代码

修改 .htaccess

php_value session.save_handler “memcache”
php_value session.save_path “tcp://127.0.0.1:11211″

修改程序

ini_set(“session.save_handler”,”memcache”);
ini_set(“session.save_path”, “tcp://127.0.0.1:11211″);

删除数组方法在php中可以使用unset函数或直接把指定索引设置为空这样也可以删除了,但是使用这两种方法之后数组元素索引就就空了,那么要如何解决这个问题。

如果要在某个数组中删除一个元素,可以直接用的unset,但今天看到的东西却让我大吃一惊

<?php 
$arr = array('a','b','c','d'); 
unset($arr[1]); 
print_r($arr); 
?>
 
print_r($arr)

之后,结果却不是那样的,最终结果是 Array ( [0] => a [2] => c [3] => d )
 

那么怎么才能做到缺少的元素会被填补并且数组会被重新索引呢?答案是

array_splice():

<?php 
$arr = array('a','b','c','d'); 
array_splice($arr,1,1); 
print_r($arr);
?>

print_r($arr)之后,结果是Array ( [0] => a [1] => c [2] => d )

删除数组指定元素

array_search()比较实用

array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false
$array = array('1', '2', '3', '4', '5');
$del_value = 3;
unset($array[array_search($del_value , $array)]);//利用unset删除这个元素
print_r($array);
输出
array('1', '2', '4', '5');

但这种如果要重新索引数组就需要利用foreach遍历删除的数组之后重新建立一个数组这样也是可以的。

我们工作中用到最多的就是查询或统计出两个时间差了,下面我就整理了了PHP计算两个时间的差几个例子,其实就可以统计秒 分 时 天 月 年哦,下面来看看例子。

两个时间之间月份差实例代码:

 代码如下 复制代码

$yourdate="2012-10-20";
$yourdate_unix=strtotime($yourdate);
echo (date("Y",$yourdate_unix)-date("Y"))*12+(date("m",$yourdate_unix)-date("m"));

例子1

 代码如下 复制代码

/*
    * 计算2个时间段的月份差
 * @param $st开始时间 $et结束时间(时间戳格式)
 * @return $total 返回的差值
   */
   function getMonthNum($st, $et)
   {
    $s_m = date('n', $st);
    $e_m = date('n', $et);
    $s_y = date('Y', $st);
    $e_y = date('Y', $et);
    $total = 13 - $s_m + ($e_y - $s_y - 1) * 12 + $e_m; //计算月份差
    return $total;
   }


例子2

 

 代码如下 复制代码

<?php
$one = strtotime('2011-05-08 07:02:40');//开始时间 时间戳
$tow = strtotime('2012-12-25 00:00:00');//结束时间 时间戳
$cle = $tow - $one; //得出时间戳差值

/* 这个只是提示
echo ceil($cle/60); //得出一共多少分钟
echo ceil($cle/3600); //得出一共多少小时
echo ceil($cle/3600/24); //得出一共多少天
*/
/*ceil()函数,即进一法取整*/
$d = cell($cle/3600/24);
$h = cell(($cle%(3600*24))/3600);  //%取余
$m = cell(($cle%(3600*24))/60);

echo "两个时间相差 $d 天 $h 小时 $m 分"
?>

例子3

 代码如下 复制代码

<?PHP

/*
*
*函数功能:计算两个以YYYY-MM-DD为格式的日期,相差几天
*
*/
function getChaBetweenTwoDate($date1,$date2){

    $Date_List_a1=explode("-",$date1);
    $Date_List_a2=explode("-",$date2);

    $d1=mktime(0,0,0,$Date_List_a1[1],$Date_List_a1[2],$Date_List_a1[0]);

    $d2=mktime(0,0,0,$Date_List_a2[1],$Date_List_a2[2],$Date_List_a2[0]);

    $Days=round(($d1-$d2)/3600/24);

    return $Days;
}

echo getChaBetweenTwoDate('2010-08-11','2010-08-16');
echo "<br>";
echo getChaBetweenTwoDate('2010-08-16','2010-08-11');
?>

例子4

 代码如下 复制代码

<?php
$startdate=”2010-12-11 11:40:00″;
$enddate=”2012-12-12 11:45:09″;
$date=floor((strtotime($enddate)-strtotime($startdate))/86400);
$hour=floor((strtotime($enddate)-strtotime($startdate))%86400/3600);
$minute=floor((strtotime($enddate)-strtotime($startdate))%86400/60);
$second=floor((strtotime($enddate)-strtotime($startdate))%86400%60);
echo $date.”天<br>”;
echo $hour.”小时<br>”;
echo $minute.”分钟<br>”;
echo $second.”秒<br>”;
?>

例子四是我最喜欢的一个可以计算到天小时秒哦,当然具体的还是需要根据自己的需要了。

标签:[!--infotagslink--]

您可能感兴趣的文章: