-1

データベース内に値を挿入しているため、アンチ SQL インジェクション メソッドを使用するようにアドバイスされました。私はウェブを見回しましたが、最初に失敗したのはこれで、PDO メソッドを使用して助けが必要です。オンラインで例を見つけましたが、内容が空っぽすぎて理解できませんでした(ところで、行を実行したところ、PDOが有効になっていることがわかりました):

これはどのような形でも良いですか?

<?php
include ('config.php');
// Host, User, Pass, DB
$con=mysqli_connect("127.0.0.1","*****","*****","*****");

// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQLi: " . mysqli_connect_error();
  }

$host = 'localhost';
$dbname = '****';
$user = '****';
$pass = '*****';

try {
  # MS SQL Server and Sybase with PDO_DBLIB
  $DBH = new PDO("mssql:host=$host;dbname=$dbname, $user, $pass");
  $DBH = new PDO("sybase:host=$host;dbname=$dbname, $user, $pass");

  # MySQL with PDO_MYSQL
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

  # SQLite Database
  $DBH = new PDO("sqlite:my/database/path/database.db");
}
catch(PDOException $e) {
    echo $e->getMessage();
}  

また、フォームを送信すると、次のエラーが表示されます。

Fatal error: Call to a member function prepare() on a non-object in /home/product/*****/*****/*****/processForm-test.php on line 68
4

1 に答える 1

2

コードの大きな問題の 1 つは、データベース接続を作成するためにmysqli_connectとの両方を使用していることです。PDOそうしないでください。それはサポートされていません。どちらかを使用してください。

PDO 接続を作成する行は、すべて localhost で実行されている、SQL Server、Sybase、MySQL、および SQLLite の 4 つの別個のデータベースに接続しようとします。ただし、データベース接続を同じ変数に割り当てているため、最後のハンドルのみを保持しています。

接続が成功した場合、その変数$DBHはデータベース セッション (接続) への参照になります。成功しない場合はfalse、続行する前にテストできる の値が割り当てられます。

必要なのは、次のような MySQL への単一の PDO 接続だけだと思います。

<?php
include ('config.php');

$host = 'localhost';
$dbname = '****';
$user = '****';
$pass = '*****';
try {
  # MySQL with PDO_MYSQL
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
catch(PDOException $e) {
  echo "Connect failed: " . $e->getMessage();
}

ここで推定していますが、表示されるエラー メッセージの最も可能性の高い説明は、次のようなコード行 (コード サンプルには示されていません) があることです。

$sth = $DBH->prepare($sql);

問題は、$DBH有効なデータベース接続への参照ではないことです。$DBHこれは、データベースへの接続に失敗したためです。Andfalseはオブジェクトではないため、'prepare' という名前のメソッドを関連付けることはできません。

于 2013-07-29T19:24:14.813 に答える