1

最近、PHP と MYSQL を使い始めましたが、このエラーが発生するまではすべてうまくいきました。コードを phpMyAdmin のクエリ ウィンドウに挿入すると機能しますが、ブラウザーでコードを開くと、php コード内では機能しません。私はすでにデータベースに接続しているので、それは問題ではありません。これは私が得るエラーです:

SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、1 行目の ''fatmam' (user, messageid) VALUES ('ayihan', '5')' 付近で使用する正しい構文を確認してください。

try
{
    $alicengiz = $_POST['actor'].'m';
    $sql = 'INSERT INTO :tablename (user, messageid) VALUES
    (:user, :messageid)';
    $s = $pdo->prepare($sql);
    $s->bindValue(':user', $_SESSION['username']);
    $s->bindValue(':messageid', $_POST['action1']);
    $s->bindValue(':tablename', $alicengiz);
    $s->execute();
}
catch (PDOException $e)
{
    $error = 'Error 1qqq. '. $e->getMessage();
    include 'error.php';
    exit();
}
4

2 に答える 2

1

いいえ、テーブル名、フィールド名、SQL キーワードはご用意できません。

問題は、 prepare() が入力を一重引用符で囲みますが、テーブル名とフィールド名をエスケープしたい場合はバッククォートが必要なことです。

今回は手動でエスケープする必要があります (*real_escape_stringここでは役に立ちません):

$sql = 'INSERT INTO `'.addcslashes($alicengiz, "\\'").'` (user, messageid) VALUES
(:user, :messageid)';
$s = $pdo->prepare($sql);
$s->bindValue(':user', $_SESSION['username']);
$s->bindValue(':messageid', $_POST['action1']);

Ps: しかし、実際には、これは悪い考えです。$_POST["actor"]."m"がテーブル名でない場合、PDOException がスローされるため、エスケープする代わりにホワイトリストを使用します。

于 2013-07-27T23:49:41.477 に答える
0

これはどう?

    $alicengiz = $_POST['actor'].'m';
    $sql = 'INSERT INTO messages (user, messageid) VALUES
    (:user, :messageid)';
    $s = $pdo->prepare($sql);
    $s->bindValue(':user', $_SESSION['username']);
    $s->bindValue(':messageid', $_POST['action1']);
    $s->execute();
于 2013-07-27T23:48:42.843 に答える