常见的排序算法与MSQL

常见的排序算法

1.常见的排序算法

冒泡排序法、快速排序法、简单选择排序法、堆排序法、直接插入排序法、希尔排序法、合并排序法。

(1)冒泡排序法:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序与排序要求的规则不符时,就将这两个记录进行交换。这样,关键字较小的记录将逐渐从后面向前面移动,就象气泡在水中向上浮一样,所以该算法也称为气泡排序法。

function mysort($arr){
  For($i=0; $i<count($arr); $i++){
    For($j=0; $j<count($arr)-1; $j++){
       If($arr[$j] > $arr[$j+1]){
        $tmp=$arr[$j];
        $arr[$j]=$arr[$j+1];
        $arr[$j+1]=$tmp;
        }
     }
   }
  Return $arr;
}

(2)快速排序算法:
原理:快速排序使用分治策略来把待排序数据序列分为两个子序列步骤:a.从数列中挑出一个元素,称该元素为“基准”。
b.扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
c.通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。

function quite($arr){
    $left=array();
    $right=array();
    if(count($arr)<=1){
        return $arr;
    }
    for($i=1;$i<count($arr);$i++){
        if($arr[$i]<$arr[0]){
            $left[]=$arr[$i];
        }else{
            $right[]=$arr[$i];
        }
        quite($left);
        quite($right);
    }
    return array_merge($left,array($arr[0]),$right);
}

(3)使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

//二分查找(数组里查找某个元素)
function bin_sch($array, $low, $high, $k){
    if ($low <= $high){
        $mid = intval(($low+$high)/2);
        if ($array[$mid] == $k){
            return $mid;
        }elseif ($k < $array[$mid]){
            return bin_sch($array, $low, $mid-1, $k);
        }else{
            return bin_sch($array, $mid+1, $high, $k);
        }
    }
    return -1;
}
//顺序查找(数组里查找某个元素)
function seq_sch($array, $n, $k){
    $array[$n] = $k;
    for($i=0; $i<$n; $i++){
        if($array[$i]==$k){
            break;
        }
    }
    if ($i<$n){
        return $i;
    }else{
        return -1;
    }
}

(4)二维数组排序, arr keys是排序的健值,$order是排序规则,1是升序,0是降序

function array_sort($arr, $keys, $order=0) {
    if (!is_array($arr)) {
        return false;
    }
    $keysvalue = array();
    foreach($arr as $key => $val) {
        $keysvalue[$key] = $val[$keys];
    }
    if($order == 0){
        asort($keysvalue);
    }else {
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach($keysvalue as $key => $vals) {
        $keysort[$key] = $key;
    }
    $new_array = array();
    foreach($keysort as $key => $val) {
        $new_array[$key] = $arr[$val];
    }
    return $new_array;
}

2.页面采集

$str = file_get_contents('http://bbs.lampbrother.net');
           //或者是:
$str = file("http://bbs.lampbrother.net");
           //或者是:
readfile("http://bbs.lampbrother.net");
cURL采集页面的四步:
 //1.初始化,创建一个新cURL资源
 $ch = curl_init();
 //2.设置URL和相应的选项
curl_setopt($ch,CURLOPT_URL,"http://www.lampbrother.net/");
 curl_setopt($ch, CURLOPT_HEADER, 0);
//3.抓取URL并把它传递给浏览器
curl_exec($ch);
//4.关闭cURL资源,并且释放系统资源
curl_close($ch);
//CURLOPT_URL和CURLOPT_HEADER,分别代表“需要获取的URL地址”和“启用时会将头文件的信息作为数据流输出”

3分页的具体步骤:

第一步:设置页大小(每页显示多少条)

第二步:获取当前页码

第三步:获取总记录条数

第四步:获取总页数

第五步:判断当前给定页码是否越界

第六步:组装sql语句

第七步:发送sql语句给mysql服务器

第八步:遍历结果集输出

第九步:加分页链接
(-1-)

4.分页代码实现

     <?php     
     //设置每页显示多少条记录
    $pagesize = 5;

     //获取当前页码
     $page = !empty($_GET['page'])?$_GET['page']:1;

   //总共记录条数
   $sql = "select count(*) from mytable";
   $result = mysql_query($sql);
   $count = mysql_result($result,0);

   //总共有多少页
   $page_count = ceil($count/$pagesize);

   //判断当前给定页码是否越界
   if($page<1){
      $page=1;
   }elseif($page>$page_count){
      $page=$page_count;
 }
  //开始组装sql语句
$sql = "select id,name,age,sex from mytable limit ".($page-1)*$pagesize.','.$pagesize;

 //发送sql语句
 $result = mysql_query($sql);
  //输出表格
   echo "<table border='1'>";
  echo "<tr>";
  echo "<th>用户名</th><th>年龄</th><th>性别</th>";
 echo "</tr>"; 
//定义性别数组
$sex = array('男','女');
 //遍历输出结果集
 while($row = mysql_fetch_assoc($result)){
     echo "<tr>";
     echo "<td>".$row['name']."</td>";
     echo "<td>".$row['age']."</td>";
     echo "<td>".$sex[$row['sex']]."</td>";
     [backcolor=#ffffff][color=#008ef1]echo "</tr>";[/color][/backcolor]
 }
 echo "</table>";
  //加分页显示连接
 $up = (($page-1)<1)?1:($page-1);
$down = (($page+1)>$page_count)?$page_count:($page+1);
echo "<a href='test.php?page=".$up."'>上一页</a>  ";
echo "<a href='test.php?page=".$down."'>下一页</a>  ";
echo "共计".$page_count."页  ";
echo "当前第".$page."页  ";
echo "共计".$count."条记录";
?>

5.请以空格作为间隔,拆分字符串’Apple Orange Banana Strawberry’,组成数组$fruit,
* 数组中所有元素都用小写字母,并按照字母先后次序排序

class sort { 
    private $str; 
    public function __construct($str) { 
        $this->str=strtolower($str); 
    } 
    private function explodes() { 
        if(empty($this->str)) return array(); 
        $arr=explode(" ",$this->str); 
        return is_array($arr)?$arr:array($arr); 
    } 
    public function sort() { 
        $explode=$this->explodes(); 
        sort($explode); 
        return $explode; 
    } 
} 

6.简述Linux下安装PHP的过程?

安装软件之前先安装编译工具gcc、gcc-c++
拷贝源码包,解包解压缩
Cd /lamp/php进入php目录
./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc指定安装目录和配置文件目录
Make 编译
Make install安装

7.简述Linux下安装Mysql的过程?

Groupadd mysql 添加一个用户组mysql
Useradd -g mysql mysql 添加一个mysql用户指定分组为mysq5l
Cd /lamp/mysql 进入mysql目录
./configure –prefix=/usr/local/mysql/with-extra-charsets=all
Make
Make all

8.简述Linux下安装apache的过程?

Cd /lamp/httpd 进去apache软件目录
./configure –prefix=/usr/local/apache2/ –sysconfdir=/etc/httpd/with-included-apr
Make
Make all

9.用javascript取得一个input的值?取得一个input的属性?

document.getElementById(‘name’).value;
document.getElementById(‘name’).type;

10.用Jquery取得一个input的值?取得一个input的属性?

$(“input[name='aa']“).val();
$(“input[name='aa']“).attr(‘name’);

11.请您写一段ajax提交的js代码,或者写出ajax提交的过程逻辑。

var xmlhttp;
if(window.XMLHttpRquest){
xmlhttp=new XMLHttpRequest();
}else if(window.ActiveXObject){4
xmlhttp=new ActiveXObject(‘Microsoft.XMLHTTP’);
}
xmlhttp.open(‘GET’,’1.php?aa=name’,true);
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4){
if(xmlhttp.status==200){
var text=xmlhttp.responseText;
}
}
}
xmlhttp.send(null);

12.用面向对象来实现A继承B和C对象

Interface B{ ... }
Interface C{ ... }
Class A implements B,C{ ... }
13.写出Smarty模板引擎中你最常用的关键词
Assign  Display Foreach
Section Loop        Item
$smarty    Now     Const   get
(-2-)

d
14. 用PHP写出显示客户端IP与服务器IP的代码

获取客户端IP:$_SERVER[“REMOTE_ADDR”];
获取服务器端IP:$_SERVER["SERVER_ADDR"];**

15请写一个函数验证电子邮件的格式是否正确

function checkemail($email){
echo preg_match(‘/^[\w]+@[\w]+[\.]([\w]+)$/’,$email)?’email格式正确‘:’email格式不正确‘;
}

16.简述如何得到当前执行脚本路径,包括所得到参数
SERVER[DOCUMENTROOT]. _SERVER[‘REQUEST_URI’];取得当前页面的完整路径和参数。

取得参数:$_SERVER['QUERY_STRING'];

17.JS表单弹出对话框函数?获得/失去焦点函数?

Alert();prompt confirm    Onfocus();onblur()

18.写一个函数,算出两个文件的相对路径

$a = ’/a/b/c/d/e.php’;
$b = ’/a/b/12/34/c.php’;   
计算出 $b 相对于 $a 的相对路径应该是 http://www.cnblogs.com/c/d将()添上
$a=”http://www.cnblogs.com/a/b/c/d/e.php”;
$b=”http://www.cnblogs.com/a/b/12/34/c.php”;
$ainfo=parse_url($a);
$binfo=parse_url($b);
$apath=ltrim($ainfo['path'],'/');
$bpath=ltrim($binfo['path'],'/');
$arr=explode('/',$apath);
$brr=explode('/',$bpath);

$count=count($arr);
for($i=0;$i<$count;$i++){
if($arr[$i]==$brr[$i]){
$brr[$i]='..';
}else{
break;
}
}
$cha=implode('/',$brr);
print_r($cha); 

19.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

function my_scandir($dir){
     $files = array();
     if ($handle = opendir($dir) ){
         while ( ($file = readdir($handle)) !== false ) {
             if ( $file != ".." && $file != "." ) {
                 if ( is_dir($dir . "/" . $file) ) {
                     $files[$file] = scandir($dir . "/" . $file);
                 }else {
                     $files[] = $file;
                 }
             }
         }
         closedir($handle);
         return $files;
     }
}

20.写出以下php代码的运行结果:

<?php
function foo($i) {
    $i++;
    echo $i ;
}
function bar(&$i) {
}
$i = 10 ;
echo $i++ , ++$i;    输出:10,12
foo($i); 输出:13
bar($i);     输出:无输出

21.如何快速下载一个远程http服务器上的图片文件到本地?

$file=”"; $fp=fopen($file,’rb’); $img=fread($fp,10000); $dir=”./”; $local=fopen($dir.’/’.basename($file),’w'); Fwrite($local,$img);

22..请写出一个正则表达式,用于匹配一个HTML文件中标记中的图片地址

$url=”<img src=’11.jpg’/>”;
/<img[\s]*src=['|\"](.*)['|\"][\s]*\/>/

23、用PHP打印出前一天的时间

Echo date(‘Y-m-d H:i:s’,strtotime(‘-1 day’));

24、javascript能否定义二维数组,如何解决?

javascript不支持二维数组定义,可以用arr[0] = new array()来解决

25、假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。

<script>
function go2b(){
    window.location = “b.html”;
    window.close();
}
setTimeout( “go2b()”,5000 ); //5秒钟后自动执行go2b()
</script>

26.正在浏览当前页面用户的 IP 地址:127.0.0.1

echo $_SERVER["REMOTE_ADDR"].”<br />”;

27.27.查询(query)的字符串(URL 中第一个问号 ? 之后的内容):id=1&bi=2

echo $_SERVER["QUERY_STRING"].”<br />”;
//当前运行脚本所在的文档根目录:d:inetpubwwwroot
echo $_SERVER["DOCUMENT_ROOT"].”<br />”;

28、在HTTP 1.0中,状态码 401 的含义是(未授权);如果返回“找不到文件”的提示,则可用 header 函数,其语句为header(“HTTP/1.0 404 Not Found”);


29、把 John 新增到 users 阵列?

$users[] = ‘john’;   array_push($users,‘john’);

30.在PHP中error_reporting这个函数有什么作用?

error_reporting() 设置 PHP 的报错级别并返回当前级别。

31、如何修改SESSION的生存时间(1分).

方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
方法2:$savePath = “./session_save_dir/”;
$lifeTime = 小时 * 秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
方法3:
setcookie() and session_set_cookie_params($lifeTime);

32、有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?($1分)

方法1(对于PHP5及更高版本):
$readcontents = fopen(“http://www.phpres.com/index.html”, “rb”);
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
方法2:
echo file_get_contents(“http://www.phpres.com/index.html”);

33、请使用JavaScript写出三种产生一个Image 标签的方法(提示:从方法、对象、HTML角度考虑)

(1)var img = new Image();
(2)var img = document.createElement(“image”)
(3)img.innerHTML = “<img src=”xxx.jpg” />”

34.请描述出两点以上XHTML和HTML最显著的区别

(1)XHTML必须强制指定文档类型DocType,HTML不需要
(2)XHTML所有标签必须闭合,必须是小写,HTML比较随意
(-3-)

35.写出三种以上MySQL数据库存储引擎的名称

MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十几个引擎

35、写个函数,尽可能高效从一个标准 url 里取出文件的扩展名
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php

答案1:
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(“.”,$file);
return $ext[1];
}
答案2:
function getExt($url) {
    $url = basename($url);
    $pos1 = strpos($url,”.”);
    $pos2 = strpos($url,”?”);
    if(strstr($url,”?”)){
     Return substr($url,$pos1 + 1,$pos2$pos11);
     } else {
     return substr($url,$pos1);
    }
}

36、使用五种以上方式获取一个文件的扩展名
要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,
必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数 get_ext1( filename),getext2( file_name)

function get_ext1($file_name){
return strrchr($file_name, ‘.’);
}
function get_ext2($file_name){
return substr($file_name,strrpos($file_name, ‘.’));
}
function get_ext3($file_name){
return array_pop(explode(‘.’, $file_name));
}
function get_ext4($file_name){
$p = pathinfo($file_name);
return $p['extension'];
}
function get_ext5($file_name){
return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), ‘.’)));
}

37<?php
$str1 = null;
$str2 = false;
echo $str1==$str2 ? ‘相等’ : ‘不相等’;
$str3 = ”;
$str4 = 0;
echo $str3==$str4 ? ‘相等’ : ‘不相等’;
$str5 = 0;
$str6 = ’0′;
echo $str5===$str6 ? ‘相等’ : ‘不相等’;
?>
相等 相等 不相等

38、求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数

方法一:
<?php
class Dtime{
    function get_days($date1, $date2){
        $time1 = strtotime($date1);
        $time2 = strtotime($date2);
        return ($time2-$time1)/86400;
    }
}
$Dtime = new Dtime;
echo $Dtime->get_days(’2007-2-5′, ’2007-3-6′);
?>
方法二:
<?php
$temp = explode(‘-’, ’2007-2-5′);
$time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
$temp = explode(‘-’, ’2007-3-6′);
$time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
echo ($time2-$time1)/86400;
方法三:
<?php
echo abs(strtotime(“2007-2-1″)-strtotime(“2007-3-1″))/60/60/24 计算时间差

39、请写一个函数,实现以下功能:

字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。
方法:
function str_explode($str){
$str_arr=explode(“_”,$str);$str_implode=implode(” “,$str_arr); $str_implode=implode
(“”,explode(” “,ucwords($str_implode)));
return $str_implode;
}
$strexplode=str_explode(“make_by_id”);print_r($strexplode);

方法二:
$str=”make_by_id!”;
$expStr=explode(“_”,$str);
for($i=0;$i<count($expStr);$i++){
    echo ucwords($expStr[$i]);
}
方法三:
echo str_replace(‘ ‘,”,ucwords(str_replace(‘_’,’ ‘,’open_door’)));

40.一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、存储过程分别实现。

DELIMITER //
create procedure proc_countNum(in columnId int,out rowsNo int)
begin
select count(*) into rowsNo from member where member_id=columnId;
end
call proc_countNum(1,@no);
select @no;
方法:视图:
create view v_countNum as select member_id,count(*) as countNum from member group by
member_id
select countNum from v_countNum where member_id=1

41、有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)

<?php
function BubbleSort(&$arr){
    $cnt=count($arr);
    $flag=1;
    for($i=0;$i<$cnt;$i++){
    if($flag==0){
        return;
    }
    $flag=0;
    for($j=0;$j<$cnt-$i-1;$j++){
        if($arr[$j]>$arr[$j+1]){
            $tmp=$arr[$j];
            $arr[$j]=$arr[$j+1];
            $arr[$j+1]=$tmp;
            $flag=1;
        }
    }
    }
}
$test=array(1,3,6,8,2,7);
BubbleSort($test);
var_dump($test);

42.js中网页前进和后退的代码

前进: history.forward();=history.go(1);
后退: history.back();=history.go(-1); 

(-4-)
43.echo count(“abc”); 输出什么?

答案:1

count — 计算数组中的单元数目或对象中的属性个数
int count ( mixed var[,int mode ] ), 如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回1,有一个例外,如果 var 是 NULL 则结果是 0。
对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。

44、.以下的代码会产生什么?为什么?
$num =10;
function multiply(){
    $num =$num *10;
}
    multiply();
    echo $num;
由于函式 multiply() 没有指定 $num 为全域变量(例如 global $num 或者 $GLOBALS['num'] = $GLOBALS['num'] * 10),所以 $num 的值是 10

45.写出Zend框架的目录结构,简单说明目录作用?

1.application/ – 存放应用程序的目录,包括 MVC 系统、配置文件、服务以及引导程序(Bootstrap.php)
2.configs/ –配置文件目录。
3.application/modules – 多模块目录结果例如admin(后台前程),default(前台),shop(商城)各个模块下都有自己的controllers,modules,Views
4.controllers/models/views/ – 控制器/模型/视图 目录。
5.application/cache –存放缓存等数据
6.application/helpers/ – 这个是存放“行动助手”(action helper)的目录。这些助手类默认的命名空间是“Controller_Helper_”,如果是多模块那么命令空间将是“_Controller_Helper”。
7.Bootstrap.php – 这个是应用程序入口文件。这个类的主要工作是引导应用程序,注册并初始化组件(component)。注意:不要在这个文件调用前置控制器(front
controller)的dispatch() 方法。
8.library/ – 存放类库的目录。第三方的类库和自己写的类库放在这里进行自动 加载 但要注意要用自己独立的命名空间(建子目录)。
9.public/ – 存放公开文件的目录,也即网站的根目录,存放可以被用户访问的文件,例如js、css和图片等等。index.php 是应用程序的单入口,其主要工作是建立php环境,引用Bootstrap.php来初始化,并调用前置控制器的dispatch()方法来分发请求。

46. PHP如何抛出和接收错误?

使用try…catch,异常的代码放在try代码块内,如果没有触发异常,则代码>继续执行,如果异常被触发,就会抛出一个异常。Catch代码块捕获异常,并>创建一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。

47.请问同时满足这样条件的数:被10除于9,被9除于8,被8除于7,在100—1000之间,有几个这样的数?(并写出算法)

A不存在,B 1个 C2个   D 3个
分析过程:
   P除以109:P+1就被10整除
   P除以98:P+1就被9整除
   P除以87:P+1就被8整除
   所以P=8910的功倍数-1
   8=2*2*2,9=3*3,10=2*5
   则P+1一定是2*2*2*3*3*5=360的倍数(只能约掉一个2 )
   又100<=P<=1000
   101<=P+1<=1001
   所以P+1=360,720
   所以P=359,719;

48.字符串转数组,数组转字符串,字符串截取,字符串替换,字符串查找的函数分别是什么?

   Implode()explode()substr()str_replace()strpos()strrpos()strstr()

49..简述论坛中无限分类的实现原理。

1、数据库分类表的设计:id字段、父id字段、类名称字段、path字段
2、Path字段存当前分类的路径,格式:0,父类id,本身id 3、查询分类:select * from 分类表order by
path asc; 4、这样就查出来每个分类及其对应的子类。

50.如何用php的环境变量得到一个网页地址的内容?ip得到?

echo $_SERVER ["PHP_SELF"];
echo $_SERVER ["SERVER_ADDR"];
51. 求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
$begin=strtotime(“2007-2-5″);
$end=strtotime(“2007-3-6″);
echo ($end-$begin)/(24*3600);

52.给变量赋值为0123,输出该变量值总是其他数,为什么?

PHP 解释器会把以0开始数字当八进制,所以值会变成八进制的。

53.PHP里面如何定义一个常量(constant)?

通过define()指令,例如:define(”MYCONSTANT”, 100)

54.如何对一个变量进行值传递?

可以像C++那样, 在变量的前面加上&, 例如:a = &b

55.在PHP里面可以对string “10″ 和整型 11进行比较吗?

可以,PHP内部实现会把所有东西转换成整型,所以数字10和11可以进行比较

56. 在什么情况下需要用endif 来结束条件语句?

当if语句后面跟冒号”:”而不是{时,需要用endif来结束条件语句

57.对大流量网站,您采用什么样的方法来解决访问量问题?(4分)

确认服务器硬件是否足够支持当前流量,数据库读写分离,优化数据表,程序功>能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量

58.GD库是做什么用的? (1分)

gd库提供一系列用来处理图片API,可以处理图片,或者生成图片。
在网站上GD库通常用来生成缩略图或加水印或对数据生成报表

59.写出以下程序的输出结果 (1分) 答:4

 <?php  
     $b=201;
     $c=40;
     $a=$b>$c?4:5;  
     echo $a;
?>

60、完成以下:

(一)创建新闻发布系统,表名为message有如下字段 (3分)
  id 文章id
  title 文章标题
  content 文章内容
  category_id 文章分类id
hits 点击量
答:CREATE TABLE 'message'(
'id' int(10) NOT NULL auto_increment,
'title' varchar(200) default NULL,
'content' text,
'category_id' int(10) NOT NULL,
'hits' int(20),
PRIMARY KEY('id');
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
(二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下 (4分)
  comment_id 回复id
  id 文章id,关联message表中的id
  comment_content 回复内容
  现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
  文章id 文章标题 点击量 回复数量
  用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
答:SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) hits,
IF(comment.`id` is NULL,0,count(*)) number FROM message LEFT JOIN
comment ON message.id=comment.id GROUP BY message.`id`;
(三)上述系统,表category保存分类信息,字段如下 (3分)
  category_id int(4) not null auto_increment;
  categroy_name varchar(40) not null;
  用户输入文章时,通过选择下拉菜单选定文章分类
  写出如何实现这个下拉菜单
答:function categoryList(){
$result=mysql_query("select category_id,categroy_name from category")
or die("Invalid query: " . mysql_error());
print(" ... ");
}

(-5-)
61.编写一个在线留言本,实现用户的在线留言功能,留言信息存储到数据库?
假设现在有数据库:test表:mess字段:id,name,message

1、html页面,填写留言:

<form  method="post" action="post.php">
留言者:<input type="text" name="name" />
留言内容:<input type="text" name="message" />
<input type="submit" value="提交" />
</form>

2、post.php页面,处理留言:



$name = $_POST['name'];
$message = $_POST['message'];
Try{
    $dsn = ''mysql:host=localhost;dbname=test;
    $pdo = new PDO($dsn,'root','112233');
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $pdo->query('set names utf8');
    $sql = "insert into test(name,message)     values('$name','$message')";
    $result = $pdo->exec($sql);
    If($result){
    Echo ‘留言成功’;
    }else{
        Echo '留言失败';
    }
}catch(PDOException $e){
    Echo $e->getCode().' : '.$e->getMessage();
}

62.实现不使用第3个变量,交换 a b的值, a b的初始值自己定。

$a=4; $b=5;
$a=explode(‘,’,$a.’,’.$b);  //把用逗号把4,5分开。
$b=$a[0];  $a=$a[1];  echo $a,$b;

63.线性表和顺序表的区别?

1、线性表包括顺序表和链表。
2、顺序表中的元素的地址是连续的,链表里面节点的地址不是连续的,是通过指针连起来的。

64.如何实现多个线程安全的写入一个文件数据。

采用锁机制,当一个用户在对此文件进行读写入操作时,将此文件锁定,操作完毕后解除锁定,在该用户进行读写入操作过程中,其他用户不能操作此文件,需要排队等待。

65.什么是满二叉树?什么事完全二叉树?

满二叉树:除了叶子节点外的所有节点都有两个子节点。
完全二叉树:每个节点最多有两个子节点,缺右不缺左,而且最多只能缺少一个叶子节点。

66.在数据库test中的一个表student,字段是name,class,score。分别代表姓名、所在班级,分数。

1) 学出每个班级中的学生,按照成绩降序排序;
select * from student order by score desc;
2) 查出每个班的及格人数和不及格人数,格式为:class、及格人数、不及格人数;
Select A.class,A.及格人数,B.不及格人数 from (select class, count() as ’及格人数‘ from student where score>=60 group by class) as A,(select class,count() as ’不及格人数‘ from student where score<60 group by class) as B where A.class=B.class;
3) 用PHP写入连接数据库(“localhost”,”msuser”,”mspass”)、执行以上SQL、显示结果、判断错误、关闭数据库的过程;
conn=mysqlconnect(localhost,root,12345');Mysqlselectdb(test); sql=””;
result=Mysqlquery( sql);
Mysql_close();

67.ftp://pub.foo.bar.com:2121/incoming/rls.sfv 请给出这个URL各部分的意义

1、ftp:// ;使用的协议是:ftp 2、Pub.foo.bar.com 是域名 3、2121 是使用的端口
4、Incoming/rls.sfv 是当前访问的文件。

68.请写出以下5个UNIX系统配置文件/服务的作用。

1、/etc/passwd :用户信息文件,其中包含用户名、用户是否有密码、用户ID及用户所属组
2、/etc/hosts:主机名数据库,包IP地址、主机名或域名、别名等信息,在此文件中添加记录可绕过DNS 3、/etc/fstab
保存了系统所有分区信息的配置文件。 4、Crontab 计划任务命令 5、Sshd 远程连接管理命令

69.写一个SQL语句打印出每个用户的昵称及其发表的文章总数。

Select user.name,A.id,A.总数 from user,(select id,count(*) as ’总数‘ from article group by id) as A where user.id=A.id;

70.写一个函数实现字符串翻转

1、Strrev()
2、自己写:
Function str($a){
$len=strlen($a);
$b=”";
For($i=$len-1;$i>=0;$i–){
$b.=$a[$i];
}
Return $b;
}

71.请写出下列PHP代码的执行结果

$var1 = 5;
$var2 = 10;
function foo(&$my_var){
    global $var1;
    $var1 += 2;
    $var2 = 4;
    $my_var += 3;
    return $var2;
}
$my_var = 5;
echo foo($my_var) . ”\n”;     4
echo $my_var . ”\n”;       8
echo $var1 . ”\n”;   7
echo $var2 . ”\n”;   10
$bar = ’foo’;
$my_var = 10;
echo $bar($my_var) . ”\n”;    4

79.不断在文件hello.txt头部写入一行“Hello World”字符串,要求代码完整

$fp=fopen(‘hello.txt’,'r’);
$str=’hello!’.”\n”;
$str.=fread($fp,filesize(‘hello.txt’));
fclose($fp);
$fp1=fopen(‘hello.txt’,'w’);
fwrite($fp1,$str);

80.输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间

Echo $ip=getenv(‘REMOTE_ADDR’);
$ip=Str_replace(‘.’,”",$ip);
If($ip<1921681150 && $ip>1921681100){
Echo ’ip在192.168.1.100—–192.168.1.150之间‘;
}Else{
Echo ’ip不在192.168.1.100—–192.168.1.150之间‘;
}

81.数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案?
瓶颈主要有:

1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存
4、内存带宽

82.设定网站的用户数量在千万级,但是活跃用户的数量只有1%,如何通过优化数据库提高活跃用户的访问速度?

我们可以根据用户的活跃程度,把活跃的用户提取出来放到另外一张表里面,每次活跃的用户登陆的时候就直接到活跃用户表中进行查询,这样就提高了数据库的查询速度。

(-6-)
82.请将2维数组按照name的长度进行重新排序,按照顺序将id赋值。

<?php
$Tarray = array(
    array(‘id’ => 0, ‘name’ => ‘123’),
    array(‘id’ => 0, ‘name’ => ‘1234’),
    array(‘id’ => 0, ‘name’ => ‘1235’),
    array(‘id’ => 0, ‘name’ => ‘12356’),
    array(‘id’ => 0, ‘name’ => ‘123abc’)
)

foreach($tarray as $key=>$val){
    $c[]=$val['name'];
}
function aa($a,$b){
    if(strlen($a)==strlen($b)) return 0;
    return strlen($a)>strlen($b)?-1:1;
}
usort($c,’aa’);
$len=count($c);
for($i=0;$i<$len;$i++){
$t[$i]['id']=$i+1;
$t[$i]['name']=$c[$i];
}
echo ’<pre>’;
print_r($t);
echo ’</pre>’;

选择题:

28.输出为Mozilla/4.0(compatible;MSIE5.01;Window NT 5.0)时,可能的输出语句是:B

  A.$_SERVER['HTTP_USER_AGENT_TYPE'];
  B. $_SERVER['HTTP_USER_AGENT'];
  C. $_SERVER['USER_AGENT'];
  D. $_SERVER['AGENT'];

29.下面功能PHP无法实现的是:D

   A. 服务器端脚本运行
   B. 命令行脚本运行
   C. 客户端图形界面(GUI)程序
   D. 浏览器端执行DOM操作

30.下面说法不正确的是:C

   A. PHP有四种标量类型:布尔型(boolean),整型(integer),浮点型(float),字符串(string)
   B. 浮点型(float)与双精度型(double)是同一种类型
   C. 符合类型包括:数组(array),对象(object),资源(resource)
   D. 伪类型:混合型(mixed),数字型(number),回调(callback)

31.执行下面的代码后,A

    <?php   echoprint不是系统函数(看手册)
      echo function_exists('print');   imagecreatetruecolor
    ?>
    得到的输出是:
   A. 空
   B. true
   C. false
   D. FALSE

32.下面不是PHP语法的组成部分的函数是:AD

   A. array
   B. eval
   C. each
   D. list

33.执行下面的代码的结果是什么?A

   <?php
      $bool = TRUE;
      echo gettype($bool);
      echo is_string($bool);
   ?>
   A. boolean
   B. boolean0
   C. booleanFALSE
   D. booleanfalse
34.写出下面代码执行的结果:12 10 18
   <?php
      $a = 12;
      $b = 012;
      $c = 0x12;
      echo$a,"\n",$b,"\n",$c;
   ?>

35.下面代码的执行结果是什么?C

    <?php
    echo 1+2+"3+4+5";
   ?>
  A. 0
  B. 3
  C. 6
  D. "33+4+5";

36.下面代码加入下面那个函数后返回TRUE:B

   return ? == 'A';
   A. ord(65)
   B. chr(65)
   C. 65+''
   D. ''+65

37.下面代码的输出正确的是:C

  <?php
      $a =array(1=>5,5=>8,22,2=>'8',81);
      echo $a[7];
      echo $a[6];
      echo $a[3];
   ?>
  A. 空2281 B.空8122C.8122空D.空空空

38.下面代码的输出结果:D

   <?php
      $a[bar]='hello';
      echo $a[bar];
      echo $a['bar'];
   ?>
  A. hello B. 空空 C.报错D.hellohello

39.写出下面代码的结果:C

左右相当于乘2,右移相当于除2
   <?php             二进制位移后
      echo 1>>0;  0001 0001
      echo 2>>1;  0010 0001
      echo 3<<2;  0011 1100
   ?>
  A. 012 B. 106 C. 1112 D.123

40.下面代码的执行结果:D

   <?php   中间的i少个$
     for($i=0;i<10;$i++){
         print $i;
      }
   ?>
  A. 0123456789 B. 012345678910 C. 无输出 
D. 死循环

41.下面对于echo, print 的描述正确的是:C

   A. echo, print 都可以打印多个参数
   B. print 可以打印多个参数,echo 不可以
   C. echo  可以打印多个参数,print不可以
   D. echo, print 都不可以打印多个参数

42.对于正面的代码

   <?php
      $fruits = array('strawberry'=>'red','banana'=>'yellow');
   ?>
   能够正确得到结果'yellow'的代码是:ACD
   A. echo "A banana is{$fruits['banana']}";
   B. echo "A banana is$fruits['banana']";
   C. echo "A banana is{$fruits[banana]}";
   D. echo "A banana is$fruits[banana]";
(-7-)

43.下面代码执行完成后的结果是什么?1 2

   <?php
      function change(){
         static $i = 0;
         $i++;
         return $i;
      }
      print change();  //1
      print change();  //2
   ?>
44.下面的include语句不正确的是?A
  A. include "mms://www.abc.com/a.php";
   B. include"http://www.abc.com/a.php";
   C. include"https://www.abc.com/a.php";
   D. include"ftp://www.abc.com/home/a.php";
45.<?php
      $foo = 'test';
      $bar = <<<'EOT'
      $foobar
EOT;
      echo$bar;
      ?>
上面的语句输出结果 (a): A
  a. $foo bar;
   b. 'EOT' $foo bar EOT;
   c. test bar;
   d. 'EOT' test bar EOT;

46. a=3; b=4;

   if($a||$b=5){    ||或和|的区别
      echo 'todo';
   }
   $b的值是(a): A
   a. 4;
   b. 5;
   c. 3;
   d. False
 ```
72.下列PHP函数中不能直接在页面输出字符串的函数是 B

A. echo
B. sprintf
C. printf

73.在PHP中,‘+’操作符的功能不包括 A

A. 字符串连接
B. 数组数据合并
C. 变量数据相加

74.下面哪个选项没有将john添加到users数组中?C

(A) $users[] = ’john’;
(B) array_push($users, ’john’);
(C) $users ||= ’john’;
(D) array_unshift($users, ’john’);

二、 什么是SQL注入

如果你打算永远不使用某些数据的话,那么把它们存储于一个数据库是毫无意义的;因为数据库的设计目的是为了方便地存取和操作数据库中的数据。但是,如果只是简单地这样做则有可能会导致潜在的灾难。这种情况并不主要是因为你自己可能偶然删除数据库中的一切;而是因为,当你试图完成某项”无辜”的任务时,你有可能被某些人所”劫持”-使用他自己的破坏性数据来取代你自己的数据。我们称这种取代为”注入”。
其实,每当你要求用户输入构造一个数据库查询,你是在允许该用户参与构建一个存取数据库服务器的命令。一位友好的用户可能对实现这样的操作感觉很满意;然而,一位恶意的用户将会试图发现一种方法来扭曲该命令,从而导致该被的扭曲命令删除数据,甚至做出更为危险的事情。作为一个程序员,你的任务是寻找一种方法来避免这样的恶意攻击。

三、 SQL注入工作原理

构造一个数据库查询是一个非常直接的过程。典型地,它会遵循如下思路来实现。仅为说明问题,我们将假定你有一个葡萄酒数据库表格”wines”,其中有一个字段为”variety”(即葡萄酒类型):

  1. 提供一个表单-允许用户提交某些要搜索的内容。让我们假定用户选择搜索类型为”lagrein”的葡萄酒。

  2. 检索该用户的搜索术语,并且保存它-通过把它赋给一个如下所示的变量来实现:
    variety= _POST[‘variety’];
    因此,变量$variety的值现在为:
    lagrein

3. 然后,使用该变量在WHERE子句中构造一个数据库查询:
$query = “SELECT * FROM wines WHERE variety=’$variety’”;
所以,变量$query的值现在如下所示:
SELECT * FROM wines WHERE variety=’lagrein’
4. 把该查询提交给MySQL服务器。
5. MySQL返回wines表格中的所有记录-其中,字段variety的值为”lagrein”。

到目前为止,这应该是一个你所熟悉的而且是非常轻松的过程。遗憾的是,有时我们所熟悉并感到舒适的过程却容易导致我们产生自满情绪。现在,让我们再重新分析一下刚才构建的查询。

1. 你创建的这个查询的固定部分以一个单引号结束,你将使用它来描述变量值的开始:

$query = ” SELECT * FROM wines WHERE variety = ‘”;

2. 使用原有的固定不变的部分与包含用户提交的变量的值:

query.= variety;

3. 然后,你使用另一个单引号来连接此结果-描述该变量值的结束:

query.=; query的值如下所示:
SELECT * FROM wines WHERE variety = ‘lagrein’
这个构造的成功依赖用户的输入。在本文示例中,你正在使用单个单词(也可能是一组单词)来指明一种葡萄酒类型。因此,该查询的构建是无任何问题的,并且结果也会是你所期望的-一个葡萄酒类型为”lagrein”的葡萄酒列表。现在,让我们想象,既然你的用户不是输入一个简单的类型为”lagrein”的葡萄酒类型,而是输入了下列内容(注意包括其中的两个标点符号):
lagrein’ or 1=1;
现在,你继续使用前面固定的部分来构造你的查询(在此,我们仅显示$query变量的结果值):
SELECT * FROM wines WHERE variety = ‘
然后,你使用包含用户输入内容的变量的值与之进行连接(在此,以粗体显示):
SELECT * FROM wines WHERE variety = ‘lagrein’ or 1=1;
最后,添加上下面的下引号:
SELECT * FROM wines WHERE variety = ‘lagrein’ or 1=1;’
于是,这个查询结果与你的期望会相当不同。事实上,现在你的查询包含的不是一条而是两条指令,因为用户输入的最后的分号已经结束了第一条指令(进行记录选择)从而开始了一条新的指令。在本例中,第二条指令,除了一个简单的单引号之外别无意义;但是,第一条指令也不是你所想实现的。当用户把一个单引号放到他的输入内容的中间时,他结束了期望的变量的值,并且引入了另一个条件。因此,不再是检索那些variety为”lagrein”的记录,而是在检索那些满足两个标准中任何一个(第一个是你的,而第二个是他的-variety为”lagrein”或1等于1)的记录。既然1总是1,因此,你会检索到所有的记录!
你可能反对:我不会使用双引号来代替单引号来描述用户提交的变量吗?不错,这至少可以减慢恶意用户的攻击。(在以前的文章中,我们提醒过你:应该禁止所有对用户的错误通知信息。如果在此生成一条错误消息,那么,它有可能恰恰帮助了攻击者-提供一个关于他的攻击为什么失败的具体的解释。)
在实践中,使你的用户能够看到所有的记录而不只是其中的一部分乍看起来似乎不太费事,但实际上,这的确费事不少;看到所有的记录能够很容易地向他提供有关于该表格的内部结构,从而也就向他提供了使其以后实现更为恶毒目的的一个重要参考。如果你的数据库中不是包含显然无害的酒之类信息而是包含例如一个含有雇员年收入的列表,那么,刚才描述情形会是特别真实的。
而从理论角度分析,这种攻击也的确是一件很可怕的事情。由于把意外的内容注入到你的查询中,所以,此用户能够实现把你的数据库存取转化为用于实现他自己的目的。因此现在,你的数据库已经对他打开-正如对你敞开一样。

四、 PHP和MySQL注入

如我们前面所描述的,PHP,从本身设计来说,并没有做什么特别的事情-除了按照你的指示操作之外。因此,如果为恶意用户所用,它也只是按照要求”允许”特别设计的攻击-例如我们前面所描述的那样。
我们将假定,你不会故意地或甚至是偶然地构造一个具有破坏性效果的数据库查询-于是,我们假定问题出在来自你的用户的输入方面。现在,让我们来更为细致地分析一下用户可能向你的脚本提供信息的各种途径。

(-8-)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值