学习时候犯错的地方
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
轉載于:https://www.cnblogs.com/luwenjie110/p/4788558.html
總結
- 上一篇: 计算机网络之数据链路层:1、概述
- 下一篇: (软件工程复习核心重点)第一章软件工程概