2013-07-27 62 views
1

我最近开始使用PHP和MYSQL,一切都很顺利,直到我开始得到这个错误。当我将代码插入到phpMyAdmin的查询窗口时,代码起作用,但当我用浏览器打开它时,它不能在php代码内工作。我已经连接到数据库,所以这不是问题。 这是错误我得到:PHP,MYSQL错误?

SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法错误 ;检查对应于您 MySQL服务器版本使用附近的'fatmam '正确的语法手册(用户, 信息id)VALUES( 'ayihan', '5')' 在行1

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(); 
} 
+1

表名不能用参数 –

+1

替换不要使表名称参数 – Elbek

+0

谢谢你们,我觉得很愚蠢x)也许我是 – ayihan

回答

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']); 

P.S:但实际上,这是一个坏主意。我会使用白名单而不是转义,因为当$_POST["actor"]."m"不是表名时,将引发PDOException。

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(); 
+0

谢谢大家!它工作,我不知道表名不能用参数 – ayihan

+0

@ user2626621取代,不​​要忘了upvote和接受,所以谁得到同样的问题知道解决方案。 – Elbek