多数大学生出来选择的工作和专业无关
首页 > 专业知识

PHP整数取余返回负数的相关解决办法

时间:2018-10-18 20:33:57 [来源]:郑州PHP培训学校

   PHP整数取余返回负数的相关解决办法

  PHP整数取余返回负数对于编程经验不足的新手来说还是比较头疼的一件事。希望通过本文介绍的内容,大家能充分掌握这一解决办法。
  PHP语言虽然功能强大,但并不代表其没有缺点,在编写代码的过程中未免会遇到一些让人头痛的问题。下面我们将为大家介绍有关PHP整数取余返回负数的解决办法。
  PHP加入数据程序的具体实现方法
  我们先来看个例子.
  $res = 16244799483;
  echo $res%9999999;
  // 输出结果为 -5069794, 正确的结果应该是4801107其实这也算上PHP一个BUG吧.最主要是PHP是个弱类型语言.他内置了机器来判断用户的类型.
  但是机器毕竟是机器.也有判断出错的时候.就像上面.所以这时候我们就需要人工干预下.
  所以我就想到要用下面的方法来解决PHP整数取余返回负数的问题.
  $res = floatval(16244799483);
  var_dump($res % 9999999);
  我们看到结果还是错误的-5069794.
  但是值得注意的是返回是一个int类型的.
  详细思考了一下.PHP整数取余返回负数的问题是这样处理的.
  PHP取余默认为整数的.
  而且当你定义$res = 16244799483;
  其实就已经溢出了.所以要加上强制类型转换.变成float类型.
  但是这样还不够.因为%这个取模计算还是针对整数的.
  所以我们需要一个函数fmod.是针对float类型的.
  所以最终PHP整数取余返回负数的解决办法为:
  $res = floatval(16244799483);
  var_dump(fmod($res,9999999));
  这样我们就解决了PHP整数取余返回负数这个问题.:)详解PHP防范SQL注入的具体方法
  PHP防范SQL注入是一个非常重要的安全手段。相信大家对这一安全防范方法还不是很了解,希望通过本文介绍的内容大家能够充分掌握这一知识点。
  一个优秀的PHP程序员除了要能顺利的编写代码,还需要具备使程序处于安全环境下的能力。今天我们要向大家讲解的是有关PHP防范SQL注入的相关方法。
  说到网站安全就不得不提到SQL注入(SQL Injection),如果你用过ASP,对SQL注入一定有比较深的理解,PHP的安全性相对较高,这是因为MYSQL4以下的版本不支持子语句,而且当php.ini里的 magic_quotes_gpc 为On 时。
  提交的变量中所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符,给SQL注入带来不少的麻烦。
  请看清楚:“麻烦”而已~这并不意味着PHP防范SQL注入,书中就讲到了利用改变注入语句的编码来绕过转义的方法,比如将SQL语句转成ASCII编码(类似:char(100,58,92,108,111,99,97,108,104,111,115,116…)这样的格式),或者转成16进制编码,甚至还有其他形式的编码,这样以来,转义过滤便被绕过去了,那么怎样防范呢:
  a. 打开magic_quotes_gpc或使用addslashes()函数在新版本的PHP中,就算magic_quotes_gpc打开了,再使用addslashes()函数,也不会有冲突,但是为了更好的实现版本兼容,建议在使用转移函数前先检测magic_quotes_gpc状态,或者直接关掉,代码如下:
  PHP防范SQL注入的代码
  // 去除转义字符
  function stripslashes_array($array) {
  if (is_array($array)) {
  foreach ($array as $k => $v) {
  $array[$k] = stripslashes_array($v);
  }
  } else if (is_string($array)) {
  $array = stripslashes($array);
  }
  return $array;
  }
  @set_magic_quotes_runtime(0);
  // 判断 magic_quotes_gpc 状态
  if (@get_magic_quotes_gpc()) {
  $_GET = stripslashes_array($_GET);
  $_POST = stripslashes_array($_POST);
  $_COOKIE = stripslashes_array($_COOKIE);
  }
  去除magic_quotes_gpc的转义之后再使用addslashes函数,代码如下:
  PHP防范SQL注入的代码
  $keywords = addslashes($keywords);
  $keywords = str_replace("_","\_",$keywords);//转义掉”_”
  $keywords = str_replace("%","\%",$keywords);//转义掉”%”
  后两个str_replace替换转义目的是防止黑客转换SQL编码进行攻击。
  b. 强制字符格式(类型)
  在很多时候我们要用到类似xxx.php?id=xxx这样的URL,一般来说$id都是整型变量,为了防范攻击者把$id篡改成攻击语句,我们要尽量强制变量,代码如下:
  PHP防范SQL注入的代码
  $id=intval($_GET[‘id’]);
  当然,还有其他的变量类型,如果有必要的话尽量强制一下格式。
  c. SQL语句中包含变量加引号
  这一点儿很简单,但也容易养成习惯,先来看看这两条SQL语句:
  SQL代码
  SELECT * FROM article WHERE articleid='$id'
  SELECT * FROM article WHERE articleid=$id两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯。
  d.URL伪静态化
  URL伪静态化也就是URL重写技术,像Discuz!一样,将所有的URL都rewrite成类似xxx-xxx-x.html格式,既有利于SEO,又达到了一定的安全性,也不失为一个好办法。但要想实现PHP防范SQL注入,前提是你得有一定的“正则”基础。
  初步了解PHP获取数据库表信息函数
  PHP获取数据库表信息函数包括:mysql_list_dbs();mysql_db_name();mysql_list_tables();mysql_list_tables();mysql_tablename()。
  当我们利用PHP编程时,需要操作数据库的话,将会用到mysql函数。这个函数包含的内容有很多,我们下面将会介绍的是有关PHP获取数据库表信息函数的一些内容。
  PHP获取数据库表信息函数之mysql_list_dbs()resource mysql_list_dbs([resource link_id])获取服务器上所有数据库名称.
  举例:
  mysql_connect("localhost", "name","pwd");$dbs = mysql_list_dbs();
  while (list($db) = mysql_fetch_row(dbs)) {echo "$db <br>";
  }
  注意,输出结果与使用的用户权限相关.
  PHP获取数据库表信息函数之mysql_db_name()
  string mysql_db_name(resource result_set, interger index)获取在mysql_list_dbs()返回的result_set中位置为index的数据库名.
  PHP获取数据库表信息函数之mysql_list_tables()resource mysql_list_tables(string database [,resource link_id])获取database中的所有表名.
  PHP获取数据库表信息函数之mysql_tablename()string mysql_tablename(resource result_set, interger index)获取mysql_list_tables()返回的result_set中位置为index的表名.
  PHP加入数据程序的具体实现方法
  PHP加入数据程序对于初次接触PHP语言的新手来说还是不太熟悉的。希望通过本文的介绍大家能够初步了解这一方法的实现步骤。
  PHP可以对数据库实现许多种操作,比如增删改查等功能。我们在这篇文章中将要为大家具体介绍有关PHP加入数据程序的代码示例。
  PHP加入数据程序代码:
  $datedate=date(”Y-m-d H:i:s”);
  //取得系统时间
  $ip = $HTTP_SERVER_VARS[REMOTE_ADDR];
  //取得发言的IP地址
  $text=encode($gb_text);
  //去掉留言内容后面的空格.
  $fp=fopen(”gb.dat”,”a”);
  //以只写模式打开gb.dat文本文件,文件指针指向文件尾部.
  $str=$ip.”|”.$date.”|”.$gb_name.”|”.$gb_email.”|”.$gb_home.”|”.$face.”|”.$gb_qq.”|”.$head.”|”.$text.”|”.$reply.”\n”;//将所有留言的数据赋予变量$str,”|”的目的是用来今后作数据分割时的数据间隔符号。
  fwrite($fp,$str);
  //将数据写入文件
  fclose($fp);
  //关闭文件
  showmessage(”留言成功!”,”index.php”,”3″);//留言成功,3秒后自动返回主界面。
  PHP加入数据程序的代码中的$gb_name 、$gb_email、$gb_home、$face、$gb_qq、$head、$gb_text、$reply是由发言表单传过来的数据。
  PHP开发中问题总结及解疑
  我们在这里总结的PHP开发中问题包括ord()和intval()函数的使用;assignment in condition 警告的原因;表单提交本页的问题;打印输出内容函数的问题以及格林威治时间和制定格式时间互相转换的问题等。
  PHP语言虽然功能强大,但是在实际编辑代码中同样会出现很多问题。下面我们就对经常出现的错误做了一个详细的总结,希望对大家有些帮助。
  PHP开发中问题1. PHP中的ord()和intval()函数使用?
  ord()函数返回一个字符的ASCII码值;
  对intval()而言,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。如果字符串第一个是‘-',则从第二个开始算起。
  如果参数是符点数,则返回他取整之后的值。
  当然intval()返回的值在一个4字节所能表示的范围之内(-2147483648~2147483647),对于超过这个范围的值将用边界值代替;举例如下:
  ord('A')=65;
  intval("A")=0;
  intval("1123Asdfka3243")=1123;
  intval(12.3223)=12;
  intval("1213423423459348752347598723498572398475")=2147483647;intval("-1213423423459348752347598723498572398475")=-2147483648;PHP开发中问题2. assignment in condition 警告的原因?
  PHP手册上都这样用过的啊: while ($data = mysql_fetch_assoc($result)) 结果提示了一个assignment in condition警告,经过检查终于发现,原来是写法不严谨照成的,并不是错误。解决方法如下:
  while (($row = mysql_fetch_assoc($result)) != false)这样就不会有提示了
  PHP开发中问题3.表单提交本页?
  <form action="/index.PHP" method="post" >
  action后面跟本页的地址如上,
  或者用$_SERVER['PHP_SELF']如下
  <form action='.$_SERVER['PHP_SELF'].' method="POST" >
  PHP开发中问题4.打印输出内容函数?
  echo : 输出变量或字符
  print_r : 输出数组
  var_dump :输出布尔值
  PHP开发中问题5. 格林威治时间和制定格式时间互相转换?
  a) 格林威治时间转换为制定格式时间
  /**
  * 把时间戳转换为格林威治时间
  *
  * 建议使用PHP自带的 gmdate / date
  */
  function UnixToGmt($format_string = "Y-m-d H:i:s" ,$UnixTime = 0){
  return @gmdate($format_string,$UnixTime);}
  b) 当前时间的格林威治时间?
  $d1 = date(mktime()) + 28800; //加上时区差8小时例:
  $d2 = UnixToGmt("Y-m-d H:i:s", $d1); //当前时间指定格式时间echo $d2; //输出
  PHP开发中问题6、获得GET传过来的参数?
  如:http://127.0.0.1/index.PHP?id=3
  获得ID的值:$_GET[id]
  PHP脚本的几种标记解析
  PHP脚本总共有四种标记,包括:标准标签;脚本标签;短标签和asp标签。我们将在接下来的文章中为大家具体讲解。
  我们今天要向大家介绍的是关于PHP脚本的相关知识。希望对于刚刚接触PHP语言不久的同学们有所帮助,提高我们对于PHP语言的理解。
  PHP addslashes()函数的具体应用解析
  1、 PHP脚本有四种标记: 短标签和asp标签虽方便但移植性及发行性较差,通常不推荐。此外注意如果将 PHP 嵌入到 XML 或 XHTML 中则需要使用标准标签 < ?php ?> 以保持符合标准。
  A, 标准标签:< ?php .. ?>
  B, 脚本标签:< script language=”php”>…< /script>
  C, 短标签:< ? … ?> 需要在php.ini中设置short _open_tag=on,默认是on,或者在 PHP 编译时加入了 –enable-short-tags 选项。(PHP 3版本还可以通过 short_tags() 函数激活使用短标记。)D, asp标签(PHP 3.0.4 版后支持): <% … %>需要在php.ini中设置asp_tags=on,默认是off2, PHP脚本指令分隔符: 同 C,java 或 Perl 一样,PHP 需要在每个语句除末行(因为结束标记隐含表示了一个分号 )后用分号结束指令。而文件末行省略分号有利于使用输出缓冲和 include() 或者 require()3, PHP脚本注释: PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释。例如:
  单行注释:// ,#
  多行注释:/* */
  < ?php
  echo "This is a test"; // 单行注释 (c++ 风格),/* 多行注释:单行注释说明1:"// ?>"中 ?>有效,单行注释说明2:"// < /script>"中 < /script>无效 */echo "This is yet another test";
  echo "One Final Test"; # 单行注释 (shell风格)?>
 
  探讨PHP数学函数的类别
  PHP数学函数都包括有:Abs;Acos;Acosh;Asin;Asinh;Atan;Atan2;Atan;Atanh;Atanh;BinDecBase_convert;Ceil等等。
  我们在学习PHP语言的时候,知道它是一种嵌入式的HTML脚本语言,他包含有许多功能强大的函数,我们今天将要为大家具体讲解PHP数学函数的类别总结。
  PHP字符串原理的示例讲解
  PHP substr函数的实现功能技巧讲解
  Abs
  函数描述:mixed abs(mixed number);
  返回值:函数abs返回参数number的绝对值。
  Acos
  函数描述:double acos(double number);
  返回值:函数acos返回参数number的反余弦值。如果参数number大于1或小于1,则其反余弦值无意义 。
  Acosh --
  反双曲余弦
  Asin
  函数描述;double asin(double number);
  返回值:函数asin返回参数number的反正弦值。如果参数number大于1或小于1,则其反正弦值无意义 。
  Asinh --
  反双曲正弦
  Atan
  函数描述:double atan(double number);
  函数atan返回参数number的反正切值。
  Atan2
  函数描述:Double atan2(double x , double y);返回值:函数atan2返回由直角坐标系指定的座标点在极座标系中的角度的弧度值。
  Atan --
  反正切
  Atanh --
  反双曲正切
  BinDec
  函数描述:int bindec(string binary_number);返回值:函数bindec返回一个用二进制数写成的字符串binary_number的整数值。PHP使用32位带符号的整数,其二进制数的第一位是符号位。
  Base_convert --
  在任意进制之间转换数字
  Ceil
  函数描述:int ceil(double number);
  返回值:函数ceil返回大于参数number 的最小整数;若number为整数。,则返回其本身。
  Cos
  函数描述:double cos(double angle);
  返回值:函数cos返回以弧度的大小为参数angle的角的余弦值。
  Cosh --
  双曲余弦
  DecBin
  与Bindec相反,将十进制转为二进制。
  DecHex(<->HexDec)
  返回十六进制值
  DecOct(<->OctDec)
  返回八进制值
  Deg2rad(<->Rad2reg)
  函数描述:double deg2red(double angle);
  返回值:函数deg2red返回角度数angle相对应的弧度值。
  Exp
  函数描述:double exp(double power);
  返回值:函数exp返回自然对数的power次幂。
  Expm1 --
  返回 Exp(number) - 1,甚至当 number 的值接近零也能计算出准确结果Floor
  函数描述:int floor(double number);
  返回值:返回参数number的整数部分。
 
  PHP操作符的种类概览
  PHP操作符可以包括赋值操作符;算术操作符;连接操作符;合计赋值操作符;自动增减操作符;比较操作符和逻辑操作符。
  PHP语言是一个功能非常强大的嵌入式HTML脚本语言,许多程序员都用它来创建自己的网站。我们接下来要为大家介绍的是有关PHP操作符的相关知识。
  探讨PHP数学函数的类别
  浅析PHP object对象的具体含义
  1)赋值操作符:=
  2)算术操作符:+,-,*,/,%(取模)
  3)连接操作符:. ,无论操作数是什么,都当成String,结果返回String4)合计赋值操作符(Combined Assignment Operators):+=,*=,/=,-=,%=,.=5)自动增减操作符(Automatically Incrementing and Decrementing):
  (1)$variable+=1 ?$variable++;$variable-=1 ?$variable-,跟c语言一样,先做其他操作,后++或-(2)++$variable,-$variable,先++或-,再做其他操作6)比较操作符:
  = =(左边等于右边),!=(左边不等于右边),= = =(左边等于右边,且数据类型相同),
  >=,>,<,<=
  7)逻辑操作符:|| or,&& and,xor(当左右两边有且只有一个是true,返回true),!

上一篇:PHP开发工程师就业市场依旧很大

下一篇:PHP字符集编码出现乱码的解决办法