php $_POST 与 php://input的区别分析

 更新时间:2016年11月25日 16:25  点击:1706

$_POST 与 php教程://input可以取到值,$HTTP_RAW_POST_DATA 为空
$_POST 以关联数组方式组织提交的数据,并对此进行编码处理,如urldecode,甚至编码转换

php://input 也可以实现此这个功能可以获得POST的原始数据。

代码
echo   file_get_contents( "php://input ");

实例
 

<form action="post.php" method="post">
<input type="text" name="user">
<input type="password" name="password">
<input type="submit">
</form>

post.php

 

<? echo file_get_contents("php://input");?>


php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data"。


php $_POST

$_POST 变量是一个数组,内容是由 HTTP POST 方法发送的变量名称和值。

$_POST 变量用于收集来自 method="post" 的表单中的值。从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。

html

<form action="welcome.php" method="post">
Enter your name: <input type="text" name="name" />
Enter your age: <input type="text" name="age" />
<input type="submit" />
</form>

welcome.php

Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old!

通过 HTTP POST 发送的变量不会显示在 URL 中。
变量没有长度限制

这是一款关于网站目录备份的php教程网站备份程序了,他可以对你能操作权限的目录进行打包生成rar压缩文件哦,希望有需要的朋友下载看看。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>网站程序备份</title>
</head>
<body>
<form name="myform" method="post" action="">
<?php
error_reporting(E_ALL & ~E_NOTICE);
ini_set('memory_limit', '2048M');
echo "选择要压缩的文件或目录:<br>";
$fdir = opendir('./');
while($file=readdir($fdir))
{
if($file=='.'|| $file=='..')
continue;
echo "<input name='dfile[]' type='checkbox' value='$file' ".($file==basename(__FILE__)?"":"checked")."> ";
if(is_file($file))
{
echo "<font face="wingdings" size="5">2</font> $file<br>";
}
else
{
echo "<font face="wingdings" size="5">0</font> $file<br>";
}
}
?>
<br>
包含下列文件类型:
<input name="file_type" type="text" id="file_type" value="" size="50">
<font color="red">
(文件类型用"|"隔开,默认空则包含任意文件,例:如果需要打包php和jpg文件,则输入"php|jpg")
</font>
<br>
压缩文件保存到目录:
<input name="todir" type="text" id="todir" value="__dwb2011__" size="15">
<font color="red">
(留空为本目录,必须有写入权限)
</font>
<br>
压缩文件名称:
<input name="zipname" type="text" id="zipname" value="dwb2011.zip" size="15">
<font color="red">
(.zip)
</font>
<br>
<br>
<input name="myaction" type="hidden" id="myaction" value="dozip">
<input type='button' value='反选' onclick='selrev();'>
<input type="submit" name="Submit" value=" 开始压缩 ">
<script language='网页特效'>
function selrev()
{
with(document.myform)
{
for(i=0;i<elements.length;i++)
{
thiselm = elements[i];
if(thiselm.name.match(/dfile[]/))
thiselm.checked = !thiselm.checked;
}
}
}
</script>
<?php
error_reporting(E_ALL & ~E_NOTICE);
set_time_limit(0);
class PHPzip
{
var $file_count = 0 ;
var $datastr_len = 0;
var $dirstr_len = 0;
var $filedata = ''; //该变量只被类外部程序访问
var $gzfilename;
var $fp;
var $dirstr='';
var $filefilters = array();
function SetFileFilter($filetype)
{
$this->filefilters = explode('|',$filetype);
}
//返回文件的修改时间格式.
//只为本类内部函数调用.
function unix2DosTime($unixtime = 0)
{
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
if ($timearray['year'] < 1980)
{
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;
}
return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
}
//初始化文件,建立文件目录,
//并返回文件的写入权限.
function startfile($path = 'dodo.zip')
{
$this->gzfilename=$path;
$mypathdir=array();
do
{
$mypathdir[] = $path = dirname($path);
} while($path != '.');
@end($mypathdir);
do
{
$path = @current($mypathdir);
@mkdir($path);
} while(@prev($mypathdir));
if($this->fp=@fopen($this->gzfilename,"w"))
{
return true;
}
return false;
}
//添加一个文件到 zip 压缩包中.
function addfile($data, $name)
{
$name = str_replace('', '/', $name);
if(strrchr($name,'/')=='/')
return $this->adddir($name);
if(!empty($this->filefilters))
{
if (!in_array(end(explode(".",$name)), $this->filefilters))
{
return;
}
}
$dtime = dechex($this->unix2DosTime());
$hexdtime = 'x' . $dtime[6] . $dtime[7] . 'x' . $dtime[4] . $dtime[5] . 'x' . $dtime[2] . $dtime[3] . 'x' . $dtime[0] . $dtime[1];
eval('$hexdtime = "' . $hexdtime . '";');
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$c_len = strlen($zdata);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
//新添文件内容格式化:
$datastr = "x50x4bx03x04";
$datastr .= "x14x00"; // ver needed to extract
$datastr .= "x00x00"; // gen purpose bit flag
$datastr .= "x08x00"; // compression method
$datastr .= $hexdtime; // last mod time and date
$datastr .= pack('V', $crc); // crc32
$datastr .= pack('V', $c_len); // compressed filesize
$datastr .= pack('V', $unc_len); // uncompressed filesize
$datastr .= pack('v', strlen($name)); // length of filename
$datastr .= pack('v', 0); // extra field length
$datastr .= $name;
$datastr .= $zdata;
$datastr .= pack('V', $crc); // crc32
$datastr .= pack('V', $c_len); // compressed filesize
$datastr .= pack('V', $unc_len); // uncompressed filesize
fwrite($this->fp,$datastr); //写入新的文件内容
$my_datastr_len = strlen($datastr);
unset($datastr);
//新添文件目录信息
$dirstr = "x50x4bx01x02";
$dirstr .= "x00x00"; // version made by
$dirstr .= "x14x00"; // version needed to extract
$dirstr .= "x00x00"; // gen purpose bit flag
$dirstr .= "x08x00"; // compression method
$dirstr .= $hexdtime; // last mod time & date
$dirstr .= pack('V', $crc); // crc32
$dirstr .= pack('V', $c_len); // compressed filesize
$dirstr .= pack('V', $unc_len); // uncompressed filesize
$dirstr .= pack('v', strlen($name) ); // length of filename
$dirstr .= pack('v', 0 ); // extra field length
$dirstr .= pack('v', 0 ); // file comment length
$dirstr .= pack('v', 0 ); // disk number start
$dirstr .= pack('v', 0 ); // internal file attributes
$dirstr .= pack('V', 32 ); // external file attributes - 'archive' bit set
$dirstr .= pack('V',$this->datastr_len ); // relative offset of local header
$dirstr .= $name;
$this->dirstr .= $dirstr; //目录信息
$this -> file_count ++;
$this -> dirstr_len += strlen($dirstr);
$this -> datastr_len += $my_datastr_len;
}
function adddir($name)
{
$name = str_replace("", "/", $name);
$datastr = "x50x4bx03x04x0ax00x00x00x00x00x00x00x00x00";
$datastr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
$datastr .= pack("v", 0 ).$name.pack("V", 0).pack("V", 0).pack("V", 0);
fwrite($this->fp,$datastr); //写入新的文件内容
$my_datastr_len = strlen($datastr);
unset($datastr);
$dirstr = "x50x4bx01x02x00x00x0ax00x00x00x00x00x00x00x00x00";
$dirstr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
$dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );
$dirstr .= pack("V", 16 ).pack("V",$this->datastr_len).$name;
$this->dirstr .= $dirstr; //目录信息
$this -> file_count ++;
$this -> dirstr_len += strlen($dirstr);
$this -> datastr_len += $my_datastr_len;
}
function createfile()
{
//压缩包结束信息,包括文件总数,目录信息读取指针位置等信息
$endstr = "x50x4bx05x06x00x00x00x00" .
pack('v', $this -> file_count) .
pack('v', $this -> file_count) .
pack('V', $this -> dirstr_len) .
pack('V', $this -> datastr_len) .
"x00x00";
fwrite($this->fp,$this->dirstr.$endstr);
fclose($this->fp);
}
}
if(!trim($_REQUEST[zipname]))
$_REQUEST[zipname] = "dodozip.zip";
else
$_REQUEST[zipname] = trim($_REQUEST[zipname]);
if(!strrchr(strtolower($_REQUEST[zipname]),'.')=='.zip')
$_REQUEST[zipname] .= ".zip";
$_REQUEST[todir] = str_replace('','/',trim($_REQUEST[todir]));
if(!strrchr(strtolower($_REQUEST[todir]),'/')=='/')
$_REQUEST[todir] .= "/";
if($_REQUEST[todir]=="/")
$_REQUEST[todir] = "./";
function listfiles($dir=".")
{
global $dodozip;
$sub_file_num = 0;
if(is_file("$dir"))
{
if(realpath($dodozip ->gzfilename)!=realpath("$dir"))
{
$dodozip -> addfile(implode('',file("$dir")),"$dir");
return 1;
}
return 0;
}
$handle=opendir("$dir");
while ($file = readdir($handle))
{
if($file=="."||$file=="..")
continue;
if(is_dir("$dir/$file"))
{
$sub_file_num += listfiles("$dir/$file");
}
else
{
if(realpath($dodozip ->gzfilename)!=realpath("$dir/$file"))
{
$dodozip -> addfile(implode('',file("$dir/$file")),"$dir/$file");
$sub_file_num ++;
}
}
}
closedir($handle);
if(!$sub_file_num)
$dodozip -> addfile("","$dir/");
return $sub_file_num;
}
function num_bitunit($num)
{
$bitunit=array(' B',' KB',' MB',' GB');
for($key=0;$key<count($bitunit);$key++)
{
if($num>=pow(2,10*$key)-1)
{ //1023B 会显示为 1KB
$num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100)." $bitunit[$key]";
}
}
return $num_bitunit_str;
}
if(is_array($_REQUEST[dfile]))
{
$dodozip = new PHPzip;
if($_REQUEST["file_type"] != NULL)
$dodozip -> SetFileFilter($_REQUEST["file_type"]);
if($dodozip -> startfile("$_REQUEST[todir]$_REQUEST[zipname]"))
{
echo "正在添加压缩文件...<br><br>";
$filenum = 0;
foreach($_REQUEST[dfile] as $file)
{
if(is_file($file))
{
if(!empty($dodozip -> filefilters))
if (!in_array(end(explode(".",$file)), $dodozip -> filefilters))
continue;
echo "<font face="wingdings" size="5">2</font> $file<br>";
}
else
{
echo "<font face="wingdings" size="5">0</font> $file<br>";
}
$filenum += listfiles($file);
}
$dodozip -> createfile();
echo "<br>压缩完成,共添加 $filenum 个文件.<br><a href='$_REQUEST[todir]$_REQUEST[zipname]' _fcksavedurl='$_REQUEST[todir]$_REQUEST[zipname]'>$_REQUEST[todir]$_REQUEST[zipname] (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")</a>";
}
else
{
echo "$_REQUEST[todir]$_REQUEST[zipname] 不能写入,请检查路径或权限是否正确.<br>";
}
}
?>
</form>
</body>
</html>

 PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效,因此该功能不适用于 CGI 版本。在 Apache 模块的 PHP 脚本中,可以用 header() 函数来向客户端浏览器发送“Authentication Required”信息,使其弹出一个用户名/密码输入窗口。当用户输入用户名和密码后,包含有 URL 的 PHP 脚本将会加上 预定义变量 PHP_AUTH_USER , PHP_AUTH_PW 和 AUTH_TYPE 被再次调用,这三个变量分别被设定为用户名,密码和认证类型。预定义变量保存在 $_SERVER 或者 $HTTP_SERVER_VARS 数组中。支持“Basic”和“Digest”(自 PHP 5.1.0 起)认证方法。请参阅 header() 函数以获取更多信息。

PHP 版本问题: Autoglobals 全局变量,包括 $_SERVER 等,自 PHP 4.1.0 起有效, $HTTP_SERVER_VARS 从 PHP 3 开始有效。

以下是在页面上强迫客户端认证的脚本范例:

例子 34-1. Basic HTTP 认证范例

<?php教程
   if (!isset( $_SERVER [ 'PHP_AUTH_USER' ])) {
     header ( 'WWW-Authenticate: Basic realm="My Realm"' );
     header ( 'HTTP/1.0 401 Unauthorized' );
    echo 'Text to send if user hits Cancel button' ;
    exit;
  } else {
    echo "<p>Hello { $_SERVER [ 'PHP_AUTH_USER' ]} .</p>" ;
    echo "<p>You entered { $_SERVER [ 'PHP_AUTH_PW' ]} as your password.</p>" ;
  }
?> 
 


例子 34-2. Digest HTTP 认证范例

本例演示怎样实现一个简单的 Digest HTTP 认证脚本。更多信息请参考 RFC 2617 。

<?php
$realm = 'Restricted area' ;

//user => password
$users = array( 'admin' => 'mypass' , 'guest' => 'guest' );


if (!isset( $_SERVER [ 'PHP_AUTH_DIGEST' ])) {
     header ( 'HTTP/1.1 401 Unauthorized' );
     header ( 'WWW-Authenticate: Digest realm="' . $realm .
            '" qop="auth" nonce="' . uniqid (). '" opaque="' . md5 ( $realm ). '"' );

    die( 'Text to send if user hits Cancel button' );
}

// analize the PHP_AUTH_DIGEST variable
preg_match ( '/username="(?P<username>.*)",s*realm="(?P<realm>.*)",s*nonce="(?P<nonce>.*)",s*uri="(?P<uri>.*)",s*response="(?P<response>.*)",s*opaque="(?P<opaque>.*)",s*qop=(?P<qop>.*),s*nc=(?P<nc>.*),s*cnonce="(?P<cnonce>.*)"/' , $_SERVER [ 'PHP_AUTH_DIGEST' ], $digest );

if (!isset( $users [ $digest [ 'username' ]]))
    die( 'Username not valid!' );


// generate the valid response
$A1 = md5 ( $digest [ 'username' ] . ':' . $realm . ':' . $users [ $digest [ 'username' ]]);
$A2 = md5 ( $_SERVER [ 'REQUEST_METHOD' ]. ':' . $digest [ 'uri' ]);
$valid_response = md5 ( $A1 . ':' . $digest [ 'nonce' ]. ':' . $digest [ 'nc' ]. ':' . $digest [ 'cnonce' ]. ':' . $digest [ 'qop' ]. ':' . $A2 );

if ( $digest [ 'response' ] != $valid_response )
    die( 'Wrong Credentials!' );

// ok, valid username & password
echo 'Your are logged in as: ' . $digest [ 'username' ];

?> 


 


兼容性问题: 在编写 HTTP 标头代码时请格外小心。为了对所有的客户端保证兼容性,关键字“Basic”的第一个字母必须大写为“B”,分界字符串必须用双引号(不是单引号)引用;并且在标头行 HTTP/1.0 401 中,在 401 前必须有且仅有一个空格。

在以上例子中,仅仅只打印出了 PHP_AUTH_USER 和 PHP_AUTH_PW 的值,但在实际运用中,可能需要对用户名和密码的合法性进行检查。或许进行数据库教程的查询,或许从 dbm 文件中检索。

注意有些 Internet Explorer 浏览器本身有问题。它对标头的顺序显得似乎有点吹毛求疵。目前看来在发送 HTTP/1.0 401 之前先发送 WWW-Authenticate 标头似乎可以解决此问题。

自 PHP 4.3.0 起,为了防止有人通过编写脚本来从用传统外部机制认证的页面上获取密码,当外部认证对特定页面有效,并且 安全模式 被开启时,PHP_AUTH 变量将不会被设置。但无论如何, REMOTE_USER 可以被用来辨认外部认证的用户,因此可以用 $_SERVER['REMOTE_USER'] 变量。

配置说明: PHP 用是否有 AuthType 指令来判断外部认证机制是否有效。

注意,这仍然不能防止有人通过未认证的 URL 来从同一服务器上认证的 URL 上偷取密码。

Netscape Navigator 和 Internet Explorer 浏览器都会在收到 401 的服务端返回信息时清空所有的本地浏览器整个域的 Windows 认证缓存。这能够有效的注销一个用户,并迫使他们重新输入他们的用户名和密码。有些人用这种方法来使登录状态“过期”,或者作为“注销”按钮的响应行为。

例子 34-3. 强迫重新输入用户名和密码的 HTTP 认证的范例

<?php
   function authenticate () {
     header ( 'WWW-Authenticate: Basic realm="Test Authentication System"' );
     header ( 'HTTP/1.0 401 Unauthorized' );
    echo "You must enter a valid login ID and password to access this resourcen" ;
    exit;
  }

  if (!isset( $_SERVER [ 'PHP_AUTH_USER' ]) ||
      ( $_POST [ 'SeenBefore' ] == 1 && $_POST [ 'OldAuth' ] == $_SERVER [ 'PHP_AUTH_USER' ])) {
    authenticate ();
  }
  else {
   echo "<p>Welcome: { $_SERVER [ 'PHP_AUTH_USER' ]} <br />" ;
   echo "Old: { $_REQUEST [ 'OldAuth' ]} " ;
   echo "<form action=' { $_SERVER [ 'PHP_SELF' ]} ' METHOD='post'> n " ;
   echo "<input type='hidden' name='SeenBefore' value='1' />n" ;
   echo "<input type='hidden' name='OldAuth' value=' { $_SERVER [ 'PHP_AUTH_USER' ]} ' /> n " ;
   echo "<input type='submit' value='Re Authenticate' />n" ;
   echo "</form></p>n" ;
  } 


 


该行为对于 HTTP 的 Basic 认证标准来说并不是必须的,因此不能依靠这种方法。对 Lynx 浏览器的测试表明 Lynx 在收到 401 的服务端返回信息时不会清空认证文件,因此只要对认证文件的检查要求没有变化,只要用户点击“后退”按钮,再点击“前进”按钮,其原有资源仍然能够被访问。不过,用户可以通过按“_”键来清空他们的认证信息
 

  在下例中,我们是使用$PHP_AUTH_USER和$PHP_AUTH_PW这两个变量来验证进入者是否合法并允许进入。在本例中被允许登录的用户名称和密码对分别为tnc和nature: 

<? 

if(!isset($PHP_AUTH_USER)) 

Header("WWW-Authenticate: Basic realm="My Realm""); 

Header("HTTP/1.0 401 Unauthorized"); 

echo "Text to send if user hits Cancel buttonn"; 

exit; 

else 

if ( !($PHP_AUTH_USER=="tnc" && $PHP_AUTH_PW=="nature") ) 

// 如果是错误的用户名称/密码对,强制再验证 

Header("WWW-Authenticate: Basic realm="My Realm""); 

Header("HTTP/1.0 401 Unauthorized"); 

echo "ERROR : $PHP_AUTH_USER/$PHP_AUTH_PW is invalid."; 

exit; 

else 

echo "Welcome tnc!"; 

?> 

  事实上再实际引用中不大可能如上面使用代码段明显的用户名称/密码对,而是利用数据库或者加密的密码文件存取它们。 

6.3 根据指定的验证信息核实用户身份 

  首先,我们可以使用以下代码确定用户是否已经输入了用户名和密码,并显示出用户输入的信息。 

<?php 

if (!isset($PHP_AUTH_USER)) { 

header(’WWW-Authenticate: Basic realm="My Private Stuff"’); 

header(’HTTP/1.0 401 Unauthorized’); 

echo ’Authorization Required.’; 

exit; 

else { 

echo "<P>You have entered this username: $PHP_AUTH_USER<br> 

You have entered this password: $PHP_AUTH_PW<br> 

The authorization type is: $PHP_AUTH_TYPE</p>"; 

?> 

说明: 

isset()函数用于确定某个变量是否已被赋值。根据变量值是否存在,返回true或false。 

header()函数用于发送特定的HTTP标头。注意,使用header()函数时,一定要在任何产生实际输出的HTML或PHP代码前面调用该函数。 

  虽然上述代码相当简单,没有根据任何实际值对用户输入的用户名和密码进行有效验证,但是至少我们了解了如何使用PHP在客户端产生输入对话框。 

  下面,我们就来了解一下如何根据指定的验证信息核实用户身份。代码如下: 

<?php 

if (!isset($PHP_AUTH_USER)) { 

header(’WWW-Authenticate: Basic realm="My Private Stuff"’); 

header(’HTTP/1.0 401 Unauthorized’); 

echo ’Authorization Required.’; 

exit; 

else if (isset($PHP_AUTH_USER)) { 

if (($PHP_AUTH_USER != "admin") || ($PHP_AUTH_PW != "123")) { 

header(’WWW-Authenticate: Basic realm="My Private Stuff"’); 

header(’HTTP/1.0 401 Unauthorized’); 

echo ’Authorization Required.’; 

exit; 

} else { 

echo "<P>You’re authorized!</p>"; 

?> 

  在这里,我们首先检查用户是否已经输入了用户名称和密码,如果没有则弹出相应对话框要求用户输入身份信息。随后,我们通过判断用户输入的信息是否符合admin/123这一指定用户帐号来授予用户访问权限或提示用户再次输入正确的信息。这种方法适用于所有用户都使用同一登录帐号的网站。 

6.4 另一种简易的密码验证 

  如果你是在windows98下面编写和运行着你的PHP脚本,或者是你在Linux下面按默认设置,将PHP安装成一个CGI程序的话,你将无法使用上面的PHP程序来实现验证功能。为此,无边给大家提供了另外一种简易的密码验证的方法。虽然实用性不大,但是拿来学习还是挺好的。 

<?php
if($_POST[Submit]=="提交"){  //如果用户提交了数据,则执行操作
$password=$_POST[password];    //获取用户输入的数据,并保存在变量 password 中
$cpassword=$_POST[cpassword];   //获取用户输入的确认数据,保存在变量 $cpassord 中
if(empty($password) || empty($cpassword))
{
    die("密码不可空!");
}
elseif ( ((strlen($password) < 5) || (strlen($password) > 15)))
{
    die("密码长度在5和15之间");
}
   //--- 值比较
elseif ( !(strlen($password) == strlen($cpassword)) )
{
    die("两次输入密码不匹配! ");
}
elseif( !($password === $cpassword)) //值和数据类型比较
{
   die("两次密码不匹配! ");
}
else  //循环输出密码,因为是密码所以输出*号
{
    for ($i=0;$i<strlen($password);$i++)
      {
            echo "*";
      }
}
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>表单验证-密码字段验证</title>
</head>
<body>
<form name="form1" method="post" action="<?=$_SERVER['PHP_SELF'] ?>">
请输入密码:<input type="text" name="password"><br>
确认密码:<input type="password" name="cpassword"><br>
<input type="submit" name="Submit" value="提交">
</form>
</body>
</html>

 

php教程myadmin不需要密码登录的设置方法

下了下最新版的phpmyadmin
装上后输入用户名root然后点登录 (因为我在本地,所以root没有密码)
结果老是报访问被拒绝的错误
看了下权限的设置没什么问题呀,
网上也没找到好的答案,
与是根踪代码,原来在配置文件config.default.php里面有句:
$cfg['Servers'][$i]['AllowNoPasswordRoot'] = false;
在libraries/common.inc.php的886行对他进行了验证
如果他是false的话,用户名如果是root用户,则密码不能为空,否则不进行验证,他默认情况下就是flase,把他改成true就行了,
我想这可能是他为了安全着想吧,让人一定设root密码,呵 呵,不过我认为在测试的时候有点不方便,一般本地的root用户都是空的
其衩他可以把提示语句改下,说是你的root密码为空,以当前的安全级别不允许登录
可以到XXX地方把设置改过来,这样可能会明白 些,单一个访问被拒绝太难找原因了!


方法二

./phpmyadmin 进去后在用户权限里面修改,允许空密码登陆!

方法三

默认phpmyadmin空密码登录是被禁止的,这一行为主要通过配置文件libraries/config.default.php中的两个全局变量控制,即

 代码如下:
$cfg['Servers'][$i]['nopassword'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;


只要修改这两个变量,设定为True,phpmyadmin就会允许以空密码方式登录,即修改libraries/config.default.php中的

 代码如下:
$cfg['Servers'][$i]['nopassword'] = true;
$cfg['Servers'][$i]['AllowNoPassword'] = true;


同时将

 代码如下:
$cfg['Servers'][$i]['password'] = '';

设置数据库教程连接密码设为空密码,即告成功。

php教程 fputcsv() 函数csv数据读写数据库教程文件代码

fputcsv() 函数用于将数据格式为csv格式,以便写入文件或者数据库。

1.将字符串写入csv文件中

 

    $test_array = array(
        array("111","sdfsd","sdds","43344","rrrr"),
        array("sssssssss","gdfgfd","232323","wwewe","dsfds"),
        array("fgfg","e4343","dsfds","w2332","xcvxc"),
        array("11212","2323","344343","344343","rerreer"),
        array("fds","43344444","33333333","ttttttt","gggggggggggg"),
        array("kdfs","dsfdsfds","wewewe","sdsdddddddd","wwwwwwwwwww")
    );
   
    $file = fopen("test.csv","w") or die("Can't Open test.csv");
    foreach($test_array as $line_array)
    {
        $isSuccess = fputcsv($file,$line_array);
        print $isSuccess."<br>";

     if($isSuccess===false)
        {
            die("Can't write csv line".$line_array);
        }
    }
    fclose($file) or die("Can't close file test.csv.");


fputcsv()函数返回所写入行的字符的个数或者false,当写入失败时返回false。

2.将格式化的csv字符串保存到字符串中。

 

$test_array = array(
        array("111","sdfsd","sdds","43344","rrrr"),
        array("sssssssss","gdfgfd","232323","wwewe","dsfds"),
        array("fgfg","e4343","dsfds","w2332","xcvxc"),
        array("11212","2323","344343","344343","rerreer"),
        array("fds","43344444","33333333","ttttttt","gggggggggggg"),
        array("kdfs","dsfdsfds","wewewe","sdsdddddddd","wwwwwwwwwww")
    );
    ob_start();
    $file = fopen("php://output","w") or die("Can't Open php://output");
    foreach($test_array as $line_array)
    {
        $isSuccess = fputcsv($file,$line_array);
        if($isSuccess===false)
        {
            die("Can't write csv line".$line_array);
        }
    }
   
    fclose($file) or die("Can't close file test.csv.");
    $result = ob_get_contents();
    ob_end_clean();


以用fgetcsv(file,length,separator,enclosure)函数读取csv文件。

fgetcsv的参数说明如下:

file:需要读取的csv文件,此参数是必需的。

length:表示大于csv文件中最长的行的长度的值。php5之前是必需参数。在php5中是可选参数,如果不设置此参数或者将其设为0,php将会读取

一整行的数据。如果行的长度超过8192个字节时,应该将length值设定一个数,而不是让php自动去计算行的长度。

separator:指定数据的分隔符,默认是逗号,如果指定为“;”,那么fgetcsv函数将按照“;”来解析行数据。

fgetcsv的返回值:

根据file的一行数据,返回一个数组。如果读取文件出错,则返回false。到达文件尾部时,也返回false。

下面是一个读取test.csv文件的例子。

$file = fopen('test.csv','r') or die("Can't open file test.csv");
    $color="#ff0000";
    print '<table border=0>';
    while($csv_line=fgetcsv($file))
    {
        print "<tr>";
        $len = count($csv_line);
        for($i=0;$i<$len;$i++)
        {
            if($i%2==0)$color="#cccccc";
            else $color="#999999";
            print '<td bgcolor='.$color.'>'.htmlentities($csv_line[$i]).'</td>';
        }
        print "</tr>";
    }
    print '</table>';
    fclose($file) or die("Can't close file test.csv!");

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • MYSQL事务回滚的2个问题分析

    因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • 谈谈Jquery中的children find 的区别有哪些

    精华:find方法能找子孙,children方法只能找儿子一、Jquery中children 语法.children(selector) 说明expr是表达式,可选参数,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表...2015-10-21
  • JS双击变input框批量修改内容

    这篇文章主要介绍了JS双击变input框批量修改内容的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2017-01-09
  • vue:el-input输入时限制输入的类型操作

    这篇文章主要介绍了vue:el-input输入时限制输入的类型操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-05
  • PS中像素大小、文档大小的区别

    在PS中像素大小、文档大小有什么区别呢,这个估计很多初学者不清楚,下面我来给大家讲解一下,希望对你有帮助。 1、像素大小 通常用于显示屏显示的图片大小的调整。菜...2016-09-14
  • Mysql索引会失效的几种情况分析

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 ...2014-06-07
  • vue element table中自定义一些input的验证操作

    这篇文章主要介绍了vue element table中自定义一些input的验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-18
  • 如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标

    从IE 10开始,type=”text” 的 input 在用户输入内容后,会自动产生一个小叉叉(X),方便用户点击清除已经输入的文本,下面通过本文给大家介绍下如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标...2017-01-09
  • python 爬取京东指定商品评论并进行情感分析

    本文主要讲述了利用Python网络爬虫对指定京东商城中指定商品下的用户评论进行爬取,对数据预处理操作后进行文本情感分析,感兴趣的朋友可以了解下...2021-05-28
  • Underscore源码分析

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
  • C#中sleep和wait的区别分析

    这篇文章主要介绍了C#中sleep和wait的区别分析,有助于深入理解C#中线程的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • uniapp和vue的区别详解

    这篇文章主要介绍了uniapp和vue的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-10-19
  • php中php://input的用法详细

    在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input。 下面的例子摘取的是wordpres...2016-11-25
  • list与push的区别

    //函数list while(list($id,$username,$password,$add_date,$mdn,$mobile,$channel,$last_date,$area,$nickname) = mysql_fetch_array($rs)){ ...2016-11-25
  • vue 清空input标签 中file的值操作

    这篇文章主要介绍了vue 清空input标签 中file的值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-21
  • Google会不会取消PR的理由分析

    Google是这样介绍PageRank的:   Google 出类拔萃的地方在于专注开发“完美的搜索引擎”,联合创始人拉里&middot;佩奇将这种搜索引擎定义为可“确解用户...2017-07-06
  • input框中的name和id的区别

    这篇文章主要介绍了input框中的name和id的区别介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-11-22