データベースからphpを用いて検索ワードに基づき、データを取ってくるプログラムを作成しています。データは住所のデータです。
検索して10件ごとにページを表示させたいのですが、1ページ目はうまくいくものの2ページ目から上手くいかず、下の図のようになってしまいます。
そして3ページ目からは更に上のURLにあるwordのところに何も値が入らなくなってしまいます。また1ページの時はページ数が7だったのですが、恐らく全部検索しているのか、ページ数がとても多くなっています。
一応次ページのデータを引渡せてはいると思うのですが、色々やってもここから進まないです。
やったこと
query を prepareやbindParamやexecuteに変更して実行した。理由はLIMITが変数を数字として見てくれないと考えたからである。しかし結果は変わらなかった。
<a href>...でwordに次ページでも変数を引継げるようにした。しかしあまり上手くいっていない。
ソースコード
html
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>PHP TEST</title> 6</head> 7<body> 8<form action="testphp.php" method="post"> 9 検索ワード:<input type="text" name="word" /> 10 <input type="submit" /> 11</form> 12 13 14</body> 15</html> 16
php
1 2<?php 3 4define('max_view',10); 5$word = $_POST["word"]; 6 7$servername = "localhost"; 8$username = "shizutaro"; 9$password = " "; 10$dbname = "CSexp1DB"; 11$port = "80"; 12 13// Create connection 14$conn = new mysqli($servername, $username, $password,$dbname,$port); 15 16// Check connection 17if ($conn->connect_error) { 18 die("Connection failed: " . $conn->connect_error); 19} 20 21$word = htmlspecialchars($word); 22 23if(is_numeric($word)){ 24 $result = $conn->query("SELECT * FROM zipShizuoka WHERE zip like '%" .$word. "%' "); 25 26}else{ 27$result = $conn->query("SELECT * FROM zipShizuoka WHERE CONCAT(kana1,kana2,kana3,addr1,addr2,addr3) like '%" .$word. "%'"); 28} 29printf("%d",$result->num_rows); 30$total_count = $result->num_rows; 31$pages = ceil($total_count / max_view); 32 33if(!isset($_GET['page_id'])){ 34 $now = 1; 35 }else{ 36 $now = $_GET['page_id']; 37 } 38 39 if(is_numeric($word)){ 40 if($now == 1){ 41 $result1 = $conn->query("SELECT * FROM zipShizuoka WHERE zip like '%" .$word. "%' LIMIT 0,10"); 42 }else{ 43 $result1 = $conn->query("SELECT * FROM zipShizuoka WHERE zip like '%" .$word. "%' LIMIT ($now-1)*10,10") ; 44 } 45 }else{ 46if($now == 1){ 47 $result1 = $conn->query("SELECT * FROM zipShizuoka WHERE CONCAT(kana1,kana2,kana3,addr1,addr2,addr3) like '%" .$word. "%'LIMIT 0,10 "); 48}else { 49 $result1 = $conn->query("SELECT * FROM zipShizuoka WHERE CONCAT(kana1,kana2,kana3,addr1,addr2,addr3) like '%" .$word. "%'LIMIT $now*10,10"); 50} 51 } 52 53 54 55 echo "<br>"; 56foreach($result1 as $row){ 57 echo $row['zip'] . '' .$row['addr1'] . '' .$row['addr2'] . '' .$row['addr3']; 58 echo "<br>"; 59} 60 61for ( $n = 1; $n <= $pages; $n ++){ 62 if ( $n == $now ){ 63 echo "<span style='padding: 5px;'>$now</span>"; 64 }else{ 65 echo "<a href='./testphp.php?page_id=$n&word=$word' style='padding: 5px;'>$n</a>"; 66 } 67} 68 69$conn = $conn->close($conn); 70 71?> 72</body> 73</html> 74
よろしくお願いいたします。
追加情報
直した部分
queryを使わずにprepareで準備してからexecuteで実行した。
$_POSTではなく$_GETを利用するようにした。
ソースコード
html
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>PHP TEST</title> 6</head> 7<body> 8<form action="testphp.php" method="get"> 9 検索ワード:<input type="text" name="word" /> 10 <input type="submit" /> 11</form> 12 13 14</body> 15</html> 16
php
1 2<?php 3 4define('max_view',10); 5$word = $_GET["word"]; 6 7$servername = "localhost"; 8$username = "shizutaro"; 9$password = " "; 10$dbname = "CSexp1DB"; 11$port = "80"; 12 13// Create connection 14$conn = new mysqli($servername, $username, $password,$dbname,$port); 15 16// Check connection 17if ($conn->connect_error) { 18 die("Connection failed: " . $conn->connect_error); 19} 20 21$word = htmlspecialchars($word); 22 23if(is_numeric($word)){ 24 $result = $conn->prepare("SELECT * FROM zipShizuoka WHERE zip like '%" .?. "%' "); 25 $result->bind_param('s',$word); 26 $result->execute(); 27 28}else{ 29$result = $conn->prepare("SELECT * FROM zipShizuoka WHERE CONCAT(kana1,kana2,kana3,addr1,addr2,addr3) like '%" .?. "%'"); 30$result->bind_param('s',$word); 31$result->execute(); 32} 33 34printf("%d",$result->affected_rows); 35$total_count = $result->affected_rows; 36$pages = ceil($total_count / max_view); 37 38if(!isset($_GET['page_id'])){ 39 $now = 1; 40 }else{ 41 $now = $_GET['page_id']; 42 } 43 44 if(is_numeric($word)){ 45 if($now == 1){ 46 $result1 = $conn->prepare("SELECT * FROM zipShizuoka WHERE zip like '%" .?. "%' LIMIT 0,10"); 47 $result1->bind_param('s',$word); 48 $result1->execute(); 49 }else{ 50 $result1 = $conn->prepare("SELECT * FROM zipShizuoka WHERE zip like '%" .?. "%' LIMIT ?,10"); 51 $start = ($now-1)*10; 52 $result1->bind_param('si',$word,$start); 53 $result1->execute(); 54 } 55 }else{ 56if($now == 1){ 57 $result1 = $conn->prepare("SELECT * FROM zipShizuoka WHERE CONCAT(kana1,kana2,kana3,addr1,addr2,addr3) like '%" .?. "%'LIMIT 0,10 "); 58 $result1->bind_param('s',$word); 59 $result1->execute(); 60}else { 61 $result1 = $conn->prepare("SELECT * FROM zipShizuoka WHERE CONCAT(kana1,kana2,kana3,addr1,addr2,addr3) like '%" .?. "%'LIMIT ?,10"); 62 $result1->bind_param('si',$word,$start); 63 $result1->execute(); 64} 65 } 66 67 68 69 echo "<br>"; 70foreach($result1 as $row){ 71 echo $row['zip'] . '' .$row['addr1'] . '' .$row['addr2'] . '' .$row['addr3']; 72 echo "<br>"; 73} 74 75for ( $n = 1; $n <= $pages; $n ++){ 76 if ( $n == $now ){ 77 echo "<span style='padding: 5px;'>$now</span>"; 78 }else{ 79 echo "<a href='./testphp.php?page_id=$n&word=",urldecode($_GET["word"]),"' style='padding: 5px;'>$n</a>"; 80 } 81} 82 83$conn = $conn->close($conn); 84 85?> 86</body> 87</html> 88