热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP,MYSQL常见问题与解答_MySQL

register_globals[全局变量]的相关说明很多入门的朋友被全局变量搞的很糊涂,可以参考以下的说明:CODE决定是否将EGPCS(Environment,GET,POST,Cookie,Server)变量注册为全局变量。例如,如果register_globalson,那么URLwww.example.comtest
===> register_globals[全局变量]的相关说明
很多入门的朋友被全局变量搞的很糊涂,可以参考以下的说明:

CODE
  1. 决定是否将 EGPCS(Environment,GET,POST,COOKIE,Server)变量注册为全局变量。例如,如果 register_globals = on,那么 URL http://www.example.com/test.php?id=3 将产生 $id。或者从 $_SERVER['DOCUMENT_ROOT'] 得来 $DOCUMENT_ROOT。如果不想用户数据把全局域弄乱的话可以将此选项关闭。自 PHP 4.2.0 开始,本指令默认为 off。推荐使用 PHP 的预定义变量来替代,例如超全局变量:$_ENV,$_GET,$_POST,$_COOKIE 和 $_SERVER。



===> 一个写文本数据的函数,可以有效防止清零
自己用在计数器中,在linux下日ip8万没有发现清零的现象

CODE
  1. // Write Something to a Text
  2. function writetofile($filename,$data,$method="rb+"){
  3. touch($filename);
  4. $handle=fopen($filename,$method);
  5. flock($handle,LOCK_EX);
  6. $fettle=fwrite($handle,$data);
  7. if($method=="rb+"){ftruncate($handle,strlen($data));}
  8. fclose($handle);
  9. return $fettle;
  10. }
  11. //test
  12. writetofile("test.txt","Some data!");
  13. ?>

===> Client does not support authentication protocol
好多朋友升级了mysql为4.10以上会发生此错误,php4.x下phpmyadmin之类的程序连接不上数据库,是因为mysql4.10以上改变了用户密码验证协议,php的连接模块也需要更换新的,php5默认就是这种新的连接模块...

不想更换可以这样:

CODE
  1. # SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
  2. # FLUSH PRIVILEGES;


官方说明文档:
CODE
  1. Client does not support authentication protocol
  2. MySQL 4.1 and up uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older clients. If you upgrade the server to 4.1, attempts to connect to it with an older client may fail with the following message:
  3. shell> mysql
  4. Client does not support authentication protocol requested
  5. by server; consider upgrading MySQL client
  6. To solve this problem, you should use one of the following approaches:
  7. Upgrade all client programs to use a 4.1.1 or newer client library.
  8. When connecting to the server with a pre-4.1 client program, use an account that still has a pre-4.1-style password.
  9. Reset the password to pre-4.1 style for each user that needs to use a pre-4.1 client program. This can be done using the SET PASSWORD statement and the OLD_PASSWORD() function:
  10. mysql> SET PASSWORD FOR
  11. -> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
  12. Alternatively, use UPDATE and FLUSH PRIVILEGES:
  13. mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')
  14. -> WHERE Host = 'some_host' AND User = 'some_user';
  15. mysql> FLUSH PRIVILEGES;
  16. Substitute the password you want to use for ``newpwd'' in the preceding examples. MySQL cannot tell you what the original password was, so you'll need to pick a new one.
  17. Tell the server to use the older password hashing algorithm:
  18. Start mysqld with the --old-passwords option.
  19. Assign an old-format password to each account that has had its password updated to the longer 4.1 format. You can identify these accounts with the following query:
  20. mysql> SELECT Host, User, Password FROM mysql.user
  21. -> WHERE LENGTH(Password) > 16;
  22. For each account record displayed by the query, use the Host and User values and assign a password using the OLD_PASSWORD() function and either SET PASSWORD or UPDATE, as described earlier.

===> 如果在数字前面强制加0
格式化数字的位数,未满位的加前导0

CODE
  1. $num = 12;
  2. $var = sprintf("%09d", $num);
  3. echo $var;
  4. ?>



===> 取得当前脚本的路径
请不要用 $_SERVER['PHP_SELF']取路径,$_SERVER['PHP_SELF']取出来的在某些情况下是错误的.也不要用$_SERVER['SERVER_NAME'],$_SERVER['SERVER_NAME']取得的主机名不包含端口号,而且有时候取得的是服务器名,非你的虚拟主机名.
脚本路径:

CODE
  1. $url = 'http://'.dirname($_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']).'/';
  2. ?>


地址栏信息:

CODE
  1. $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  2. ?>



===> url传递参数需要这样编码
与 HTML 实体相匹配的变量。像 &、© 和 £ 都将被浏览器解析,并使用实际实体替代所期待的变量名。解决办法是使用 & 代替 & 作为分隔符。使用 htmlentities(urlencode($data)) 对你的 URL 进行编码。

CODE
  1. echo "";
  2. ?>


接受页面直接使用,不需要解码.

===> 数据存入MySQL需要注意
入库:

CODE
  1. $str = addslashes($str);
  2. ?>


出库:

CODE
  1. $str = stripslashes($str);
  2. ?>



===> 返回MySQL数据库上一步 INSERT 操作产生的 ID
mysql_insert_id() 返回给定的 link_identifier 中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。

CODE
  1. $last_id = mysql_insert_id();
  2. ?>



===> 如何解决表单出错返回从填的时候以前填写的东西全部消失
因为使用了session,可以用session_cache_limiter强制数据流从新生效.

CODE
  1. // session start
  2. session_cache_limiter("private, must-revalidate");
  3. session_start();
  4. ...
  5. ?>



===> 如何一劳永逸的解决Cannot send session cache limiter - headers already sent 这种错误
当用header()转向或者session_start()之前有输出,会有Cannot send session cache limiter - headers already sent的错误,可以用ob_start(),这样会在页面全部执行完毕才输出.

CODE
  1. session_start();
  2. ob_start();
  3. ...
  4. ?>



===> 如何表单填写错误时返回后以前填写的内容消失?
当使用session后会出现这种情况,我们可以使用session_cache_limiter();强制生效.

CODE
  1. session_cache_limiter("private, must-revalidate");
  2. session_start();
  3. ...
  4. ?>



===> 判断邮件地址是否合法!
判断邮件地址是否合法!

CODE
  1. if(!ereg("^[-a-zA-Z0-9_\.]+\@([0-9A-Za-z][0-9A-Za-z-]+\.)+[A-Za-z]{2,3}$",$mail_from)){
  2. echo "";
  3. exit;
  4. }
  5. ?>



===> 数组存储到MySQL数据库
数组存储到mysql中要用serialize() 产生一个可存储的值

CODE
  1. $array_in = serialize($data);
  2. ...
  3. ?>


出库时

CODE
  1. ...
  2. $array_out = unserialize($data);
  3. ?>



===> 取来源页面地址
如果是通过调用,取到的只是filename.php,而非来源页面.这时候可以用js来取.

CODE
  1. echo $_SERVER['HTTP_REFERER'];
  2. ?>



===> 实现任意文件的下载
用header可以实现任意文件的下载,而不是打开,比如txt和图片等.自己找一下Content-type,根据相应的类型替换就可以了.

CODE
  1. // We'll be outputting a gif
  2. header('Content-type: image/gif');
  3. // It will be called pic.gif
  4. header('Content-Disposition: attachment; filename="pic.gif"');
  5. // The gif source is in pic.gif
  6. readfile('pic.gif');
  7. ?>



===> 为什么 $foo[bar] 错了?[摘自php手册]
应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么 $foo[bar] 错了呢?你可能在老的脚本中见过如下语法:

CODE
  1. $foo[bar] = 'enemy';
  2. echo $foo[bar];
  3. // etc
  4. ?>


这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。
注: 这并不意味着总是给键名加上引号。用不着给键名为常量 或 变量 的加上引号,否则会使 PHP 不能解析它们。

===> 刚写了一个用MySQL保存图片和取出图片的例子 smile_big.gif
方法并不可取,因为保存图片的数据量是很大的,对宝贵的数据库资源太浪费,可以将图片存储到目录中,用数据库存储路径和文件名.

Database table:

CODE
  1. CREATE TABLE `image_table` (
  2. `id` int(4) NOT NULL auto_increment,
  3. `image` blob NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) TYPE=MyISAM;


上传图片存储到MySQL:
CODE
  1. // pic_database_upload.php By Bleakwind
  2. $Host = "localhost";
  3. $User = "bleakwind";
  4. $Password = "bleakwind";
  5. $Database = "test";
  6. mysql_connect($Host,$User,$Password) or die("Could not connect:" . mysql_error());
  7. mysql_select_db($Database) or die("Could not select database!");
  8. if(!empty($_FILES['image']['name'])){
  9. $image_data = addslashes(fread(fopen($_FILES['image']['tmp_name'], "rb"), filesize($_FILES['image']['tmp_name'])));
  10. $sql = "INSERT INTO `image_table` (`image`) VALUES ('".$image_data."')";
  11. if(mysql_query($sql)){ echo "成功!"; }else{ echo "失败!"; }
  12. }
  13. ?>
  14. value="Upload">


从数据库中取出图片.
注意:
1.可能具体应用你还要分配一个字段来存储图片类型,这样下面的header( "content-type: image/gif");这句的gif用相应的类型替换掉.
2.如果想取出多个图片可以将下面的文件存成一个文件,在另外的文件遍历ID后调用此文件输出.
CODE
  1. // pic_database_output.php By Bleakwind
  2. header( "content-type: image/gif");
  3. $Host = "localhost";
  4. $User = "bleakwind";
  5. $Password = "bleakwind";
  6. $Database = "test";
  7. $id = 1;
  8. mysql_connect($Host,$User,$Password) or die("Could not connect:" . mysql_error());
  9. mysql_select_db($Database) or die("Could not select database!");
  10. $sql = "SELECT * FROM `image_table` WHERE `id`=" . $id;
  11. $result = mysql_query($sql) or die("Could not perform query!");
  12. $row = mysql_fetch_array($result);
  13. echo $row['image'];
  14. ?>


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
author-avatar
禁令2502861143
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有