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 回答