学习时候犯错的地方

1、单引号双引号

$query = "insert into user values('$username','$password1','$email')"; //sql语句应该最外层使用双引号,变量左右也不需要加“.”

还可以写成$query = "insert into user values('".$username."','".$password1."','".$email."')";

$result = $db->query($query);

犯错1:$query = ‘insert into user values('$username','$password1','$email')’;

犯错2:$query = “insert into user values('.$username.','.$password1.','.$email.')”;

 

 2、CURD  搞清楚有没有()

查询先查出$result,

看结果数量$num_result = $result->num_rows;

用for循环取出结果集$rows = $result->fetch_assoc()

插入是否成功看成插入数量 $db->affected_rows

 

3、插入脚本javascript。其实这个错误跟问题1是一样的情况单引号双引号的问题

function do_html_url($url,$tittle){
echo "<script language=javascript>alert(".$tittle.");location.href=".$url.";</script>"; //错误的

echo "<script language=javascript>alert('".$tittle."');location.href='".$url."';</script>";//正确的

}

 

4、判断有没有在数据库里找到该数据,不能用if(!$result),因为只要sql语句本身没有错误,不论有没有查到结果,返回的都是结果有内容的,也就是true

$query = "select * from user where username = '".$username."' and passwd = '".$password."'";
$result = $db->query($query);
//var_dump($result); 打印对象内容,也是检查出错误思路的原因
$result_num = $result->num_rows;
if($result_num>0){ //成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN查询会返回一个mysqli_result 对象,其他查询则返回TRUE
                             //SELECT查询后即使是没有找到结果,也会返回对象,所以if判断结果集的行数,才能判断有没有找到
$rows = $result->fetch_assoc();
print_r($rows);
echo "Welcome ".$rows['username']."";
}else{
echo "找不到此用户.";

}

 

5、需要在一个表里查找一个用户下的bm_URL,习惯性的select *,导致返回的数组把用户名和url都放到数组中了。数组有两列就会重复输出。

   function get_user_urls($user){
       @$db = new mysqli('localhost','root','','bookmarks');
    if ($db->connect_errno) {
         echo "Can't connected database.";
         exit();
    }
    $db->query("set names 'utf8'");
       $query = "select bm_URL from bookmark where username = '".$user."'";
//$query = "select * from bookmark where username = '".$user."'"; 错误的使用*
$result = $db->query($query); $rows = $result->fetch_assoc(); return $rows; } function display_user_urls($url_array){ ////卡在数组用什么方法正确打印出来,其实是之前传过来的数组本身有问题 foreach ($url_array as $value) { printf("<br>书签:".$url_array['bm_URL']."<br>"); } }

 6、当结果集是多个数据时,怎样赋值给一个数组

$row = $result->fetch_assoc();每次只会取出第一条,所以要用for循环取值

 1    function get_user_urls($user){
 2        // @$db = new mysqli('localhost','root','','bookmarks');
 3        // if ($db->connect_errno) {
 4        //   echo "Can't connected database.";
 5        //   exit();
 6        // }
 7        // $db->query("set names 'utf8'");
 8        $db = db_connect(); //上面代码用连接数据库函数代替了
 9        $query = "select bm_URL from bookmark where username = '".$user."'";
10        $result = $db->query($query);
11        $num_result = $result->num_rows;
12        $url_array = array();
13 
14        for ($i=0; $i < $num_result ; $i++) { 
15            $row = $result->fetch_assoc();
16            $url_array[$i] = $row;  //每次的结果赋值给新的数组$url_array         
17        }
18        return $url_array;
19    }

 7、打印二维数组中的一个值

Array (

[0] => Array ( [bm_URL] => http://www.baidu.com )

[1] => Array ( [bm_URL] => http://www.jd.com )

)

foreach ($url_array as $value) {
           echo "<br>书签:".$value['bm_URL']."<br>";
       }

 8、把数组循环赋值给数组就成了二维数组,把需要赋值的数组加上角标只提取有用的值存入新数组,新的数组就是一维数组,应用方便

 1    function get_user_urls($user){
 2        $db = db_connect(); //上面代码用连接数据库函数代替了
 3        $query = "select bm_URL from bookmark where username = '".$user."'";
 4        $result = $db->query($query);
 5        $num_result = $result->num_rows;
 6        $url_array = array();
 7 
 8        for ($i=0; $i < $num_result ; $i++) { 
 9            $row = $result->fetch_assoc();
10            $url_array[$i] = $row['bm_URL'];  //每次bm_URL的结果赋值给新的数组$url_array         
11        }
12        return $url_array;
13    }
14  ?>

9、表单中checkbox的name设置为一个数组,接收的时候就能接收多选,但value为什么会自动加入到该数组还不明白

   在php echo html代码时,name="del_me[]"会报错name=\"del_me[]\"就能通过,也不明白为什么

 1    function display_user_urls($url_array){
 2     global $bm_table;
 3    $bm_table = true;
 4  ?>
 5    <form action="delbm.php" method="post" name="bm_table">
 6         <table>
 7             <?php
 8                 echo "以下是您的书签:<br>";
 9           foreach ($url_array as $value) {
10               echo "
11                     <tr>
12                       <td>书签:</td>
13                       <td><a href=".$value.">".htmlspecialchars($value)."</a></td>
14                       <td><input type='checkbox' name=\"del_me[]\" value=".$value."></input></td>
15                     </tr>";
16           }
17             ?>
18         </table>
19    </form>
20 <?php
21    }
22 ?>

 9、sql执行后,判断$result与$db->affected_rows返回结果的具体有什么区别

 1 function change_new_password($username,$password1){
 2     $db = db_connect();
 3     $query = "update user set passwd='".$password1."' where username='".$username."'";
 4     $result = $db->query($query);
 5     // if ($a = $db->affected_rows) {
 6     //   return true;
 7     //   print_r($a);
 8     //   //print_r($db->affected_rows);
 9     // }else{
10     //   return false;
11     // }
12     print_r($db->affected_rows);
13     //现在的问题是query语句是错的,按理$db->affected_rows是0,但在上面运行后是true,搞清楚是为什么(这是我原来的想法,update拼成了updata)
14     //其实如果语句错了$db->affected_rows返回是-1,而非0都是true,所以程序就按true运行
15     //如果查询语句正确但没有找到对应的数据进行更新$db->affected_rows返回是0
16     //所以看update是否成功用$db->affected_rows>0最合理(我这么认为)
17     echo "<br>";
18     var_dump($result);
19     //$result返回的是bool值,sql语句执行了返回true,执行错误返回false
20     //但有没有正在成功插入数据他并不知道,成功或失败都返回true
21     echo "<br>";
22     print_r($result);
23 
24    }

 10、总结一下:update/insert/delete 判断有没有成功用$db->affected_rows

                      select判断有没有成功用$result->num_rows

       PS.查了PHP中文手册mysql_affected_rows(),说明Returns number of affected rows by the last SELECT, UPDATE or DELETE query associated with result.

           (跟我实际测试的不一样,select用affected_rows返回是0)这个不明白

 

 

11、循环提取结果集,for循环的一种巧妙用法

 

 1 <?php
 2    function dispaly_recommend_bm($username){
 3     $db = db_connect();
 4     $query = "select bm_URL from bookmark where username in(
 5                                                select distinct(b2.username)
 6                                                from bookmark b1, bookmark b2
 7                                                where b1.username='".$username."' 
 8                                                and b1.username != b2.username
 9                                                and b1.bm_URL = b2.bm_URL)
10                                           and bm_URL not in(
11                                                select bm_URL from bookmark
12                                                where username='".$username."')
13                                           group by bm_URL";
14     $result = $db->query($query);
15     if($result->num_rows > 0){
16       echo "<table>";
17       //用这种for循环很巧妙
18       for ($i=0; $row = $result->fetch_row(); $i++) { 
19         echo "<tr><td>$row[0]</td></tr>";
20       }
21       //平时都用下面的for循环取值
22       for ($i=0; $i < $result->num_rows; $i++) { 
23         $row = $result->fetch_row();
24         echo "<tr><td>$row[0]</td></tr>";
25       }
26     }
27 ?>
28 
29    </table>
30 
31 <?php
32    }
33 ?>

 

11、查询出的结果只有一条数组时,可以先给一个变量声明为数组,让他接收查询后的数组,后面显示也就不需要用foreach了。直接用$book['title']即可

 1    function get_book_details($isbn){
 2     $db = db_connect();
 3     $query = "select * from books where isbn='".$isbn."'";
 4     $result = $db->query($query);
 5     $books = array();      //需要先声明$books为数组
 6     if ($result->num_rows > 0) {
 7       for ($i=0; $row = $result->fetch_assoc(); $i++) { 
 8         $books = $row;        //怎样赋值变成一维数组
 9       }
10       return $books;
11     }else{
12       return false;
13     }
14    }

 

12、一段程序里有多条数据库操作的,结果集变量名称需要改成不同的,不能都叫$result

posted @ 2015-09-07 12:53  luwenjie  阅读(215)  评论(0编辑  收藏  举报