質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1108閲覧

phpでのページングが上手くいかない

gentakun2

総合スコア1

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/07/01 11:39

編集2021/07/01 16:05

データベースから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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javahack

2021/07/01 12:11 編集

各パターンのSQLを$conn->query()に渡す前に変数に入れて取り出し、phpMyAdmin等のツールで実行して、想定通りの結果が得られるか試してみてはいかがでしょうか。
guest

回答1

0

まず外から持ってきた$wordをSQL文に直接放り込んではいけません
かならずprepareで処理して下さい
どうようにurlに埋め込んでもいけませんurlencodeしてください

ページングについてはアンカーで移動しているのでしたら
パラメータはgetなのでPOSTの値は引き継がれません

投稿2021/07/01 12:05

編集2021/07/01 12:06
yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentakun2

2021/07/01 16:11

貴重なご意見ありがとうございます。prepareで処理をするようにし、urlencodeも行い、POStを変えてGETにいたしましたが、白紙となってしまいました。ソースコードは追加情報の通りです。PHP初心者で申し訳ないのですが、myquli_stmtクラスの利用の際、変数は必ず$stmtでないとmyquli_stmtクラスは利用できないのでしょうか。間違っているとしたらそこの文法であるか、文法を変えたためにforeachがそのままでは利用できなくなっているのかのどちらかだと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問