学习时候犯错的地方
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