ここで、WHERE LIKE ステートメントに問題があります。理想的には、複数の用語 (または 1 つまたは他の用語) を検索できるようにしたいと考えています。現在、テスト目的で、実行している関数のタイプを選択するテストフォームでこれを分離しています。
目的: しばらくの間、更新機能を無視してください (残りの部分と同じように混乱していると思いますが、まだ完了していません)。まだ dFind() 関数を終了しようとしています。このテストの目的は、クラスを作成し、データベースにデータを挿入し、データベースでデータを検索してプルし、そのデータを更新するデータ クラスを構築できるようにすることです。これまでのところ、すべてのステップが私にとって学習曲線ですので、ご容赦ください。
dFind() に関して: 以下では、クエリを dFind() 関数内のインスタンスのように 1 つに抑えるだけで機能します (名前は 2 つのうちでより重要ですが、取得したら他のフィールドを検索する必要があります)この作業)。「OR phone LIKE :phone」をクエリに追加すると、正しいデータが取得されません (すべてが返されます)。私はphpmyadminでクエリをテストしましたが、うまくいきましたが、それがクエリ自体をどのように扱っているのか、それともphpで何かをキャッチしていないのかわかりません(また、'を追加してエスケープしようとしましたが、どちらも役に立ちませんでした)。
これについて私が間違っているところがわかりますか?前もって感謝します。また、私が取り組んでいる機能を実現するための推奨事項や方向性は大歓迎です。これらのメソッドは、コンシューマーの設定、検索、および更新のために小さなデータベースに組み込まれます。
INDEX.PHP :
<\?php
require 'incl/con.php';
require 'incl/class.php';
?>
<!DOCTYPE html>
<html>
<head><title>Test 1 Million</title>
</head>
<body>
<h3>Pull data using classes</h3>
<form method="POST" action="index.php">
<table border="0">
<tr>
<td>ID (Required for update):</td><td><input type="text" name="id" maxlength="4"></td>
</tr>
<tr>
<td>Name:</td><td><input type="text" name="name"></td>
</tr>
<tr>
<td>phone:</td><td><input type="text" name="phone"></td>
</tr>
<tr>
<td>Insert<input type="radio" name="type" value="insert" checked="checked">Find<input type="radio" name="type" value="find">Update<input type="radio" name="type" value="update"></td><td><input type="submit" value="Submit"></td>
</tr>
</table>
</form>
<?
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$type = $_POST['type'];
$name = $_POST['name'];
$phone = $_POST['phone'];
$id = $_POST['id'];
$newData = new Data($name, $phone);
if ($type == 'insert') {
$newData->dInsert();
} elseif ($type == 'find') {
$newData->dFind();
} elseif ($type == 'update') {
if ($id != null && $name != null) {
$newData->dUpdate($id,$name,$phone);
} else {
echo 'Please enter, at minimum, the id and name fields.';
return false;
}
}
} else {
echo 'Please enter data in both fields and choose the correct option.';
}
?>
</body>
</html>
CON.PHP :
<\?php
# VARs
# set the current timezone (host is MST)
date_default_timezone_set("America/New_York");
#$host = "MY_HOST";
#$db = "MY_DB";
#$user = "MY_UN";
#$pw = "MY_PW";
クラス.PHP :
<\?php
class Data {
private $dsn = "DSN STRING";
private $user = "MY_UN"; // I know this was already declared - was trying it within the class to see how it works, which does ok.
private $pw = "MY_PW"; // I know this was already declared - was trying it within the class to see how it works, which does ok.
private $opts = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION );
public $name;
public $phone;
public function __construct($n,$p) {
$this->name = $n;
$this->phone = $p;
}
public function dInsert() {
try {
$DBH = new PDO($this->dsn, $this->user, $this->pw, $this->opts);
$STH = $DBH->prepare("INSERT INTO directory (name, phone) VALUES (:name, :phone)");
$STH->bindParam(':name', $this->name);
$STH->bindParam(':phone', $this->phone);
$STH->execute();
} catch(PDOException $e) {
echo "I'm sorry, Dave. I'm afraid I can't do that.<br />";
echo date("d/m/y : H:i:s", time()) . " - " . $e->getMessage();
file_put_contents('PDOErrors.txt', date("d/m/y : H:i:s", time()) . " - " . $e->getMessage() . "\n", FILE_APPEND);
$DBH = null;
}
$DBH = null;
}
public function dFind() {
try {
$DBH = new PDO($this->dsn, $this->user, $this->pw, $this->opts);
# $STH = $DBH->prepare('SELECT id, name, phone FROM directory WHERE name LIKE :name OR phone LIKE :phone');
# $STH = $DBH->prepare("SELECT * from directory WHERE name LIKE CONCAT('%', :name ,'%') OR phone LIKE CONCAT('%', :phone ,'%')");
$STH = $DBH->prepare("SELECT * from directory WHERE name LIKE :name OR phone LIKE :phone");
$STH->bindValue(':name', '%' . $this->name . '%');
$STH->bindValue(':phone', '%' . $this->phone . '%');
$STH->execute();
$STH->setFetchMode(PDO::FETCH_ASSOC);
while($row = $STH->fetch()) {
echo $row['id'] . " " . $row['name'] . ": " . $row['phone'] . "<br />";
}
} catch(PDOException $e) {
echo "I'm sorry, Dave. I'm afraid I can't do that.<br />";
echo date("d/m/y : H:i:s", time()) . " - " . $e->getMessage();
file_put_contents('PDOErrors.txt', date("d/m/y : H:i:s", time()) . " - " . $e->getMessage() . "\n", FILE_APPEND);
$DBH = null;
}
$DBH = null;
}
public function dUpdate($id,$name,$phone) {
$this->name = $name;
$this->phone = $phone;
try {
$DBH = new PDO($this->dsn, $this->user, $this->pw, $this->opts);
$STH = $DBH->prepare('UPDATE directory SET name = :name, phone = :phone WHERE id = :id');
$STH->bindValue(':id', $id);
$STH->bindValue(':name', '%' . $name . '%');
$STH->bindValue(':phone', '%' . $phone . '%');
$STH->execute();
$STH->setFetchMode(PDO::FETCH_ASSOC);
while($row = $STH->fetch()) {
echo $row['id'] . " " . $row['name'] . ": " . $row['phone'] . "<br />";
}
} catch(PDOException $e) {
echo "I'm sorry, Dave. I'm afraid I can't do that.<br />";
echo date("d/m/y : H:i:s", time()) . " - " . $e->getMessage();
file_put_contents('PDOErrors.txt', date("d/m/y : H:i:s", time()) . " - " . $e->getMessage() . "\n", FILE_APPEND);
$DBH = null;
}
$DBH = null;
}
}
- - - - - - - - - - - - - - - - - - - - - - 解決済み - - - - - - - - - - - - - - - - - - - - - -
dFind() クエリを次のように変更するという、以下の投稿からの @mzedeler の提案 (THANKS!) を使用します。
SELECT *
FROM directory
WHERE name LIKE :name
AND :name_provided = 1
OR phone LIKE :phone
AND :phone_provided = 1
dFind() のバインドされたデータを次のように置き換えたところ、機能しているようです。
$STH->bindValue(':name', '%' . $this->name . '%');
$STH->bindValue(':phone', '%' . $this->phone . '%');
$STH->bindValue(':name_provided', empty($this->name) ? 0 : 1);
$STH->bindValue(':phone_provided', empty($this->phone) ? 0 : 1);