🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

2回答

783閲覧

PHPでgoogle検索結果を抽出する際に出るエラー

TAPIOKAMAN

総合スコア5

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

1クリップ

投稿2019/09/19 14:31

編集2019/09/20 15:34

前提・実現したいこと

PHPです。
mysqlのクエリ結果をfile_get_contentsの()内に入れるとエラーがでます。
同じ文字列を直接書き込んだり、新たに宣言して変数にして()内に入れるとエラー無く表示されます。クエリの結果をそのまま、もしくは、一度変数に置き換えてもエラーがでます。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /home/***** エラー行 $data = file_get_contents($title2);

該当のソースコード

PHP

1 2$sql3 = "SELECT * FROM AAA WHERE `title` like '" . $title . "' LIMIT 0 , 1"; 3$stmt3 = $pdo->query($sql3); 4 5while($rs3 = $stmt3->fetch(PDO::FETCH_ASSOC)){ 6 7$img = $rs3['thumb']; 8if($img==""){ 9 10//$title = "車"; このように同じ文字列でも代入するとエラーはでません。 11//$title2 = "https://www.google.co.jp/search?q=" . $title . "&tbm=isch"; 12$title2 = "https://www.google.co.jp/search?q=$title&tbm=isch"; 13$data = file_get_contents($title2); 14$data = explode( "\n", $data ); 15$cnt = count( $data ); 16for( $i=0;$i<$cnt;$i++ ) 17{ 18echo($data[$i]); 19} 20 21

試したこと

試したことは、()内を出力してみてなにか変な事になっていないか?は試しましたが一見おかしな所はないように思えました。

//の部分はこれも試したという部分です。

※追記やりたいことの説明を説明いたします。

やりたいこととソースの流れをご説明させていただきます。

$sql3 = "SELECT * FROM AAA WHERE title like '" . $title . "' LIMIT 0 , 1";
$stmt3 = $pdo->query($sql3);

while($rs3 = $stmt3->fetch(PDO::FETCH_ASSOC)){

$img = $rs3['thumb'];
if($img==""){

データーベースの中からタイトルを検索し、そのタイトルに画像$rs3['thumb']が無い場合
下記の処理に移ります。

$title2 = "https://www.google.co.jp/search?q=$title&tbm=isch";

↑次の行のfile_get_contentsでエラーが出たため()内の状態を見る為に一度$title2に代入してみました。
echo やvar_dumpでも確認しましたが、 所はなかったです。

$data = file_get_contents($title2);←エラーがでます。

もしエラーが出なければ、検索結果のページを表示したいです。

$data = explode( "\n", $data );
$cnt = count( $data );
for( $i=0;$i<$cnt;$i++ )
{
echo($data[$i]);


$title2 = "https://www.google.co.jp/search?q=$title&tbm=isch";
この状態ではエラーがますが

$title2 = "https://www.google.co.jp/search?q=車&tbm=isch";
上記のように変数を入れなければエラーがでません

また、
$title = "車";
$title2 = "https://www.google.co.jp/search?q=$title&tbm=isch";
のように直前で宣言した場合でもエラーはでません。

※※
この$titleは直前に下記の様な方法で取得しております。
while($rs2 = $stmt2->fetch(PDO::FETCH_ASSOC)){
// 1行ごとに$rsにデータが入ります
$title = $rs2['title'];

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/09/19 23:55

何がしたいのかがわからないので「前提・実現したいこと」を見直して下さい。 そしてコードのインデントを揃えて下さい。
TAPIOKAMAN

2019/09/20 15:34 編集

ご返信、ご指摘ありがとうございます。 まず、ソースを切り抜いたときに生じた記述ミス、そしてインデントの修正を行わせていただきました。 やりたいこととソースの流れをご説明させていただきます。 ※追記として編集させていただきました。 何卒よろしくお願いいたします。
yambejp

2019/09/20 06:47

ソースは質問に追記する形で記載ください
TAPIOKAMAN

2019/09/20 15:35

ご返信ありがとうございます。 初回利用の為かってが解らずご迷惑をおかけしております。 追記として編集させていただきました。
guest

回答2

0

Google検索の結果を機械的に取得することは、原則禁止されています。

Google の利用規約では、どのような種類かに関わらず、自動化されたクエリを Google から明示的な許可を事前に得ずに Google のシステムに送信することは禁止されています。(Search Console ヘルプより)

投稿2019/09/20 06:32

maisumakun

総合スコア145965

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

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

0

ベストアンサー

エラー行と書かれたソースの「$title2」は、該当のソースに記載がありません
そのあたりから検証が必要でしょうね
またgoogle検索と言いつつ、sqlで検索をするような内容も整合性が取れていません
何をどうするとどういう結果が期待されるのかきちんとまとめてから質問されると良いでしょう

投稿2019/09/20 00:15

yambejp

総合スコア116661

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

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

TAPIOKAMAN

2019/09/20 06:43

ご返信、ご指摘ありがとうございます。 まず、ソースを切り抜いたときに生じた記述ミス、そしてインデントの修正を行わせていただきました。 やりたいこととソースの流れをご説明させていただきます。 $sql3 = "SELECT * FROM AAA WHERE `title` like '" . $title . "' LIMIT 0 , 1"; $stmt3 = $pdo->query($sql3); while($rs3 = $stmt3->fetch(PDO::FETCH_ASSOC)){ $img = $rs3['thumb']; if($img==""){ データーベースの中からタイトルを検索し、そのタイトルに画像$rs3['thumb']が無い場合 下記の処理に移ります。 $title2 = "https://www.google.co.jp/search?q=$title&tbm=isch"; ↑次の行のfile_get_contentsでエラーが出たため()内の状態を見る為に一度$title2に代入してみました。 echo やvar_dumpでも確認しましたが、 所はなかったです。 $data = file_get_contents($title2);←エラーがでます。 もしエラーが出なければ、検索結果のページを表示したいです。 $data = explode( "\n", $data ); $cnt = count( $data ); for( $i=0;$i<$cnt;$i++ ) { echo($data[$i]); ※ $title2 = "https://www.google.co.jp/search?q=$title&tbm=isch"; この状態ではエラーがますが $title2 = "https://www.google.co.jp/search?q=車&tbm=isch"; 上記のように変数を入れなければエラーがでません また、 $title = "車"; $title2 = "https://www.google.co.jp/search?q=$title&tbm=isch"; のように直前で宣言した場合でもエラーはでません。 ※※ この$titleは直前に下記の様な方法で取得しております。 while($rs2 = $stmt2->fetch(PDO::FETCH_ASSOC)){ // 1行ごとに$rsにデータが入ります $title = $rs2['title']; 何卒よろしくお願いいたします。
TAPIOKAMAN

2019/09/20 15:47

thumbカラムの型はtextです。 上記ためしてみましたがエラーは変わらすでした。 $title2 = "https://www.google.co.jp/search?q={$h_title}&tbm=isch"; の $title2 を出力してみたのですが、問題なく表示されているようでした。 出力は文字化けしているのですが、$titleのエンコードを変えてもだめでした。文字化けしたままでもエラーにはならないはず、原因は他にある?と考えてしまいます。 Warning: file_get_contents(https://www.google.co.jp/search?q=縲舌げ繝�せ繝槫�闕キ諠��ア縲素igma縲後い繝エ繧ァ繝ウ繧ク繝」繝シ/繧ク繝」繝ウ繝後�繝€繝ォ繧ッ縲斐が繝ォ繧ソ縲� 譁ー螳ソver.縲阪€後げ繝ェ繝�ラ繝槭Φ縲阪⊇縺狗匱螢イ譌・豎コ螳�&tbm=isch) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /home/user
TAPIOKAMAN

2019/09/20 15:54

urlencode で解決しました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問