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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

1回答

1284閲覧

PDOを使ってRSSをDBに保存したいがエラーが出て原因がわからない

homepage-site

総合スコア50

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2021/12/15 15:58

前提・実現したいこと

パスワードが必要なのにパスワードなしでログインしようとしたというエラーメッセージが出るがパスワードは設定している

ヘディングのテキスト

<?php require_once(dirname(dirname(dirname(dirname( __FILE__ )))) . '/wp-load.php' ); //ファイルの先頭で読み込む try { $dsn = 'mysql:dbname=ozvutmpq_wp1;host=localhost'; $user = 'ozvutmpq_wp1'; $password = 'Rn_&Zi$gWKae'; $dbh = new PDO($dsn,$user,$pass); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } date_default_timezone_set("Asia/Tokyo"); $url1 = [ 'http://', 'http://', 'http://',];//フィード登録1次元配列に foreach ($url1 as $url) { //複数のRSSを結合 $feed=new SimplePie; // インスタンス生成 $feed->set_feed_url($url);// フィードしたいRSSのURL $feed->enable_cache(false); // キャッシュによって遅延が発生 デフォルトでは12時間 $success = $feed->init();// RSSが取得できたら情報を解析する if ( $success === false ){ // feedでエラーになったら終了 $error_msg = $feed->error();// メッセージ break; } $feed->handle_content_type();//コンテンツまたは空白が既にブラウザーに送信されている場合は機能しません $feeds[] = $feed; } // RSSが取得できたら情報をパースする if ($success){ $get_count = 12; // 取得数 $sql = "insert IGNORE into matome (name, title, url, created) values (:name,:title,:url,:created)"; // foreach内で代入するのは無駄なのでここで定義 // 各feed毎にget_itemsを繰り返す foreach ($feeds as $feed) { // get_itemsの引数を指定して何個取得するか指定 foreach ($feed->get_items(0, $get_count) as $item) { $name = $item->get_feed()->get_title(); $title = $item->get_title(); $url = $item->get_link(); $date = $item->get_date('Y-m-d h:i:s'); $stmt = $db->prepare($sql); $stmt->execute([ ':name' => $name, ':title' => $title, ':url' => $url, ':created' => $date ]); } } } else { echo error_msg; } $sql = "select name, title, url, created from matome"; foreach ($db->query($sql) as $row) { echo $row["name"]."\n"; //タイトル echo $row["title"]."\n"; //記事 echo $row["url"]."\n"; //記事 echo $row["created"]."\n"; //投稿時刻 echo "<br>"; } ?>

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

SQLSTATE[HY000] [1045] Access denied for user 'ozvutmpq_wp1'@'localhost' (using password: NO)

試したこと

ファイルの階層を浅くしてコードを修正
require_once(dirname( FILE ) . '/wp-load.php' ); //phpファイルの先頭でwp-load.phpを読み込む
パスワードの変更

わからないこと

wp-config.phpを直接読み込ませるのは推奨されていないためwp-load.phpから間接的に読み込ませるコードにしているんですが、これが原因でしょうか?

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

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

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

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

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

guest

回答1

0

単純に変数名が一致してないのでは?

php

1$dbh = new PDO($dsn,$user,$pass); 23$dbh = new PDO($dsn,$user,$password);

投稿2021/12/15 18:06

KazuhiroHatano

総合スコア7819

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

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

homepage-site

2021/12/16 16:26

早速のご回答ありがとうございます。 エラーが解消できました。ありがとうございます。 もう一つ変数名の不一致でエラーが出ていて、foreach ($dbh->query($sql) as $row) { と修正したのですが、 Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'ozvutmpq_wp1.matome' doesn't exist in wp-content/themes/sample_theme/index.php:401 Stack trace:というエラーが出てきて、ozvutmpq_wp1.matomeというテーブルはないといわれます。 $sql = "select name, title, url, created from matome";でテーブルを作成しているつもりなのですが、何か原因がほかにあるのでしょうか?
KazuhiroHatano

2021/12/16 17:07 編集

それはテーブル作るSQLではないでしょう・・・ テーブル作りたいなら CREATE TABLE IF NOT EXISTS テーブル名 WPではデータベースにテーブル作るときにはサイト毎に異なるプレフィクスをつけて 同じDBに違うWPが同居した時にかち合わないようにしましょう というようなお作法みたいなものがあるので その辺りのことももうちょっと調べてみましょう
homepage-site

2021/12/22 18:39

autoload.phpを扱いたくcomposerを使用するつもりだったのですが、調べてところ composer 等の管理システムを使用して導入したファイル群は、公開ディレクトリに設置されることを想定していないものも多く、直接のアクセスをされると危険なものもあります。 ライブラリを使用するのにコードの挙動をすべて確認するのは本末転倒なので、普通はドキュメントルート外に置いて手間を省きます。 自身で安全が確認できないのであれば、ドキュメントルート内に設置はしないのが適切です。 セキュリティに問題がありpublic_htmlに配置するのは不安です。 使用する予定のレンタルサーバーではpublic_html(ドキュメントルート外)にファイルを置くことができないため困っております。 さらに詳しく調べたところautoloader.phpをドキュメントルート内に配置している方もおられるようでどちらが正しいのかわかりません。 autoloader.phpやcomposer 等の管理システムを使用して導入したファイルをpublic_html内においても問題ないのでしょうか? Simplepieなどのフィードパースライブラリを使用せずに外部サイトRSSを取得可能なのでしょうか?
KazuhiroHatano

2021/12/23 00:11

RSSなんてXMLの派生にすぎないんですからsimplexml_load_stringでもパースできます しかも構造がかっちり決まってるので値の取り出しに苦労することもそうないでしょう https://www.php.net/manual/ja/function.simplexml-load-string.php vendorフォルダ内のファイルに直アクセスされるとよろしくないなら 公開ディレクトリ内でもディレクトリのアクセス権限とか.htaccessで弾くとかやりようはあります
homepage-site

2021/12/26 10:34

テーブル接続→テーブル作成(必要か不明)→RSSをまとめる→RSSを取得→RSSをテーブルに入れる→RSSを表示 これらをPHPで作成しているのですが、外部のライブラリを使用せずに取得表示する方法がわからず困っております。 参考サイトでは下記のコードの後に $dc = $item ->children('http://purl.org/dc/elements/1.1/');を使用してRSSの更新情報を取得しているようですがこれはドキュメントルート内に設置せずに使えるのでしょうか? テーブルの接続とRSSの取得に関してはおかしな点はありませんでしょうか? 参考サイト https://webgaku.hateblo.jp/entry/20120828/1346159422 //テーブル接続 <?php require_once(dirname(dirname(dirname(dirname( __FILE__ )))) . '/wp-load.php' ); //ファイルの先頭で読み込む try { $dsn = 'mysql:dbname=ozvutmpq_wp1;host=localhost'; $user = 'ozvutmpq_wp1'; $password = 'Rn_&Zi$gWKae'; $dbh = new PDO($dsn,$user,$pass); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } //RSSをまとめる $url1 = [ 'http://', 'http://', 'http://',];//フィード登録1次元配列に foreach ($url1 as $url) { //複数のRSSを読み込むには?A.RSSのURLを配列に入れ、その配列をsimplexmlの引数にします。 $count = 0;//初期のカウント //RSSを取得 $rss = simplexml_load_file("$url"); // simplexml_load_file()でRSSをパース解析してオブジェクトを取得します。 $site_title = $rss->channel->title; // RSSタイトル取得 値の代入 自作関数 $post_thumbnail= $rss->channel->thumb; // RSSサムネイル画像取得 値の代入 自作関数 $title = $item->title; // タイトル $link = $item->link; // リンク $thumb = $item->thumb->url; // アイキャッチサムネイル $content = $item ->description;// 詳細、必要なのか不明 date_default_timezone_set("Asia/Tokyo");//日時、タイトルとサムネイル画像だけほしいので要らない気がする
homepage-site

2021/12/26 10:35

simplexml_load_stringを使用させていただきました。 おしえていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問