こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

WordPressの独自テーブルへの入力フォーム

WordPressのデータベースに独自のテーブル(wp_abc)を作りました。
カラムは「code(indexです)」「name」と「address」の3つです。
このテーブルにデータを入力するフォームを作りたいです。

これまでWordPressではないSQLへのデータ入力は次のようにしていました。


●入力画面(insert.php)

<?php

function connect() {
return new PDO("mysql:dbname=xxxxx;host=yyyyy","zzzzz","password",
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`"));
}

$error = $name = '';
$pdo = connect();
if (@$_POST['submit']) {
$code = $_POST['code'];
$name = $_POST['name'];
$address = $_POST['address'];
if (!$name) $error .= '名前が入力されていません。<br>';
if (!$error) {
$pdo->query("INSERT INTO abc(name,address) VALUES('$name','$address')");
header('Location: index.php');
exit();
}
}
?>

<?php if ($error) echo "<span class=\"error\">$error</span>" ?>

<form action="insert.php" method="post">
<table>
<tr>
<th>名前</th>
<td><INPUT type="text" name="name" value="<?php echo $name ?>"></td>
<th>住所</th>
<td><INPUT type="text" name="address" value="<?php echo $address ?>"></td>
</tr>
</table>
<p><input class="submit" type="submit" name="submit" value="登録"></p>
</form>


●管理画面(index.php)

<?php

function connect() {
return new PDO("mysql:dbname=xxxxx;host=yyyyy","zzzzz","password",
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`"));
}
$pdo = connect();
$st = $pdo->query("SELECT * FROM wp_abc");
$abc = $st->fetchAll();
?>

<?php foreach ($abc as $row) { ?>

<table>
<tr>
 <th>名前</th>
<td><?php echo ($row['name']) ?></td>
</tr>
<tr>
 <th>住所</th>
<td><?php echo ($row['address']) ?></td>
</tr>
</table>

<?php } ?>


※※※※※

単純にmysql:dbname=xxxxx;host=yyyyy","zzzzz","password",の部分をWordPressのデータベースのものに置き換えましたが、うまくいきません。
どこが悪いのかご指摘いただければありがたいです。

また、他に正しい方法がありましたら教えていただけないでしょうか。

何卒よろしくお願いします。

投稿日時 - 2020-10-20 15:34:04

QNo.9813526

困ってます

質問者が選んだベストアンサー

クラスオブジェクトを渡す方法はなさそうでした。
すでにご存じかも知れませんが、こちらにいろいろな使い方の情報がありました。
http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class

INSERTはこのような書き方ができるようです。
$wpdb->insert($wpdb->abc, ['name' => $name, 'address' => $address], ['%s', '%s']);
SQL文を記述するより、簡単で、間違いが減り、安全そうです。

第2引数のデータ配列を簡単に生成できるといいのですが、そこまでの情報はここにはなかったです。
もし、するとしたら、私にはこれぐらいしか発想がありませんが、項目が多い場合は少しは楽になると思います。

$fields = ['name', 'address'];
$data = create_data($fields);
$wpdb->insert($wpdb->abc, $data);

function create_data($fields)
{
$data = [];
foreach ($fields as $field) {
$data[$field] = $_POST[$field];
}
return $data;
}
第3引数は省略しました。
データ型が文字列か数値かに関係することなのですが、省略すると文字列扱いとなり''で括られる仕組みのようです。
MySQLは数値に対して''で括ってもエラーにはならないのでいいかなと思います。
ただし、その値が文字だと「0」としてデータが登録されてしまうので、数値項目は、名前未入力と同様に先にチェックする必要があります。

WordPressに詳しい方からのアドバイスがあるといいのですが、私がPHPとMySQLの知識だけで出しゃばってしまったので、他の人が質問を見てくれなくなっていたらすみません。
先の「WordPress Codex」サイトにはあらゆる情報がありそうなので参考にしつつ、他でも検索しつつ、目的の達成を目指してください。
もちろんOKWAVEも頼りにされて。

投稿日時 - 2020-10-22 10:42:07

お礼

いろいろとアドバイス頂き、ありがとうございました。

こちらの質問の中にコードの誤り(abc=xdr)があったり、またWordPressをダウンロードしていただくというような手間をおかけして申し訳ありませんでした。

今回は一応ここで打ち切らせて頂き、もう少し先に進んでから改めてOKWAVEに質問を投稿します。
また、紹介いただいた「WordPress Codex」も参考にさせて頂きます。

繰り返しになりますが、改めてOKWAVEに質問を投稿しますので、その際はよろしくお願いします!

投稿日時 - 2020-10-22 11:32:40

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

ちょっとわかりました。
「$wpdb->xdr」はテーブル名になるのですね。
「wp-db.php」の「$tables」に「abc」を追加すると使えました。
私のだと、こんな風にテーブル名を記述できるようになると。
$rows = $wpdb->get_results("SELECT * FROM $wpdb->abc");
$wpdb->query("INSERT INTO $wpdb->abc(name,address) VALUES('$name','$address')");

想像ですが、INSERTは「$wpdb->query」関数ではなくて、クラスオブジェクトを渡す方法が用意されているような気がしています。
項目が2つ3つだとこれでもいいような気がしますが、項目が増えてきた時とか、画面の項目を一括で転送できるような仕組みが用意されているような気がするので、もしかしたら、と言う期待です。

今日は時間がないので、明日にでも調べてみます。

投稿日時 - 2020-10-21 17:52:30

ANo.3

insert.phpの追加処理が「$pdo」のままになっていました。
「$wpdb」が正しいです。

$wpdb->query("INSERT INTO wp_abc(name,address) VALUES('$name','$address')");

投稿日時 - 2020-10-21 17:37:13

ANo.2

思い違いしてました。
私が"insert"を"input"に見間違えたようで、"insert.php"でよかったです。
惑わせてすみませんでした。
1の修正はなしにしておいてください。

「global $wpdb;」についてですが、試しにWordPressをインストールして、どのようなものか確認してみました。
なるほど、便利なところがたくさんありそうです。
質問者様がWordPress標準のもの以外を、どのようなフォルダとファイル構成にしていたり、また、どのようなコード構成にしているわからないので、正確、また、いいアドバイスではないかも知れませんが、少しだけ話しておきます。
まず、先ほどのコードのような作りだけで言うと、「$wpdb」はグローバルにする必要はありません。
自前の関数内で使う場合にだけグローバルで参照してください。
また、自前の接続「connect」関数をまったく同じまま複数のファイルに書くのはよくないので「$wpdb」を利用するのが正解だと思います。
「$wpdb->get_results」関数は結果をクラスオブジェクトの配列で返してくれるので、列はプロパティ「->」のように参照できるし、「$row["name"]」と書くより「$row->name」となってすっきりしていいと思います。
「$wpdb->xdr」は初登場なのでちょっとわかりかねますが、先ほどのコードを私が試したコードにしてみるとこんな感じになりました。
私の環境の都合でもろもろ変更点があります。

●管理画面(index.php)
<?php
require __DIR__.'/wp-load.php';
$rows = $wpdb->get_results('SELECT * FROM wp_abc');
?>
<!DOCTYPE html>
<html lang="jp">

<head>
<meta charset="UTF-8">
<title>管理</title>
</head>

<body>
<!-- 勝手に入力画面へのリンクを追加しました -->
<a href="insert.php">追加</a>
<?php foreach ($rows as $row) { ?>
<table>
<tr>
 <th>名前</th>
<td><?php echo $row->name; ?>
</td>
</tr>
<tr>
 <th>住所</th>
<td><?php echo $row->address; ?>
</td>
</tr>
</table>
<?php }?>
</body>

</html>

●入力画面(insert.php)
<?php
require __DIR__.'/wp-load.php';
$error = $name = '';
if (isset($_POST['submit'])) {
$name = $_POST['name'];
$address = $_POST['address'];
if (!$name) {
$error .= '名前が入力されていません。<br>';
}
if (!$error) {
$pdo->query("INSERT INTO wp_abc(name,address) VALUES('$name','$address')");
header('Location: index.php');
exit();
}
} else {
$address = '';
}
?>
<!DOCTYPE html>
<html lang="jp">

<head>
<meta charset="UTF-8">
<title>入力</title>
</head>

<body>
<?php if ($error) {?>
<span class="error"><?=$error; ?></span>
<?php }?>
<form action="insert.php" method="post">
<table>
<tr>
<th>名前</th>
<td><INPUT type="text" name="name" value="<?php echo $name; ?>"></td>
<th>住所</th>
<td><INPUT type="text" name="address" value="<?php echo $address; ?>"></td>
</tr>
</table>
<p><input class="submit" type="submit" name="submit" value="登録"></p>
</form>
</body>

</html>

投稿日時 - 2020-10-21 17:33:49

ANo.1

input.phpに2つ気になる点があるので直してみて試してみてください。

1.自分自身へ送信する
"insert.php"はこの質問のどこにも登場していないし、データ追加のSQL処理が自分自身にあるので、たぶん"input.php"が正しい。
<form action="input.php" method="post">

2.テーブル名誤り
wp_abcが正しい。
$pdo->query("INSERT INTO wp_abc(name,address) VALUES('$name','$address')");

投稿日時 - 2020-10-21 11:17:58

補足

dell_OK様
ご回答ありがとうございました。

何か根本的な間違いがあるようで、そもそもinput.phpのファイルが開けませんでした。(HTTP ERROR 500)
これはinsert.phpの時からです。

<?php
global $wpdb;
$rows = $wpdb->get_results("SELECT * FROM $wpdb->xdr");
foreach ($rows as $row) {?>
の部分を
global $wpdb;
に変更して、後のコードもそれに準じたコードにした方がよいのでしょうか?

方向を変えていろいろと試してみます。

何かアドバイスがありましたら、よろしくお願いします。
(真っ暗闇の中、歩いてるみたいです(´_`。)

投稿日時 - 2020-10-21 15:03:27

あなたにオススメの質問