【问题标题】:PHP/SQL PDO Prepare/Execute Insert Statement not WorkingPHP/SQL PDO 准备/执行插入语句不起作用
【发布时间】:2013-04-23 01:18:29
【问题描述】:

所以我试图在我的网站上使用 PDO 对象而不是旧方法(特别是因为我听说它更适合并且正在更新一堆查询。但由于某种原因,我无法获得无论我做什么,都要准备/执行工作。

dbconnect.php:

try {
    $main = new PDO("mysql:dbname=$dbmain;host=$dbhost", $dbuser, $dbpassword);
    $tracker = new PDO("mysql:dbname=$dbtracker;host=$dbhost", $dbuser, $dbpassword);
} catch (PDOException $ex) {
    echo "Connection failed: " . $ex->getMessage();
}

tracker.php

include 'dbconnect.php';

$page = $_SERVER['PHP_SELF']; //Get page name
$ip = $_SERVER['REMOTE_ADDR'];   //Get the IP address
$browser = $_SERVER['HTTP_USER_AGENT']; //Get the browser name

if(isset($_SERVER['HTTP_REFERER'])) {
    $referer = $_SERVER['HTTP_REFERER']; //Get the page the visitor came from
}
else { //If not refered from any page, referer should be blank or error occurs
    $referer = "";
}

$result = $tracker->prepare("INSERT INTO 'pages' ('page', 'ip', 'browser', 'referer') VALUES (:page, :ip, :browser, :referer)");
$result->execute(
            array(
                ':page' => $page,
                ':ip' => $ip,
                ':browser' => $browser,
                ':referer' => $referer
                )
            );

其次,有人可以向我解释为什么我不应该对所有事情都使用 query() 吗?现在我看到我应该对非动态查询使用查询,并为动态准备/执行,但查询对两者都有效。

谢谢!

【问题讨论】:

  • 有什么错误吗?怎么了?
  • 使用准备好的/参数化查询的重点在于将数据与命令分开。这使得 SQL 注入攻击成为不可能。如果PDO::query()与任意数据一起使用,则没有这种分离,就会发生SQL注入。
  • @JohnVanDeWeghe,好吧,没有显示错误,但表格没有更新。
  • @Brad,哦!好的,这相当于我使用以前的方法。谢谢。
  • @AndyLester,天哪,我不敢相信我忘了查看我的错误日志。我正在查看我的包含所在的文件夹,而不是它们实际执行的位置,即主文件夹。它说这是一个语法错误。这更有意义。

标签: php mysql sql pdo


【解决方案1】:

我看到的问题(可能还有其他问题)是你用单引号包裹列名。 列名和表名是标识符而不是字符串文字。如果您曾经在它们上使用过保留关键字,或者列名和表名周围包含空格,则应使用反引号而不是单引号对它们进行转义,

INSERT INTO pages (page, ip, browser, referer) VALUES (...)

【讨论】:

  • 这成功了!老实说,直到我用谷歌搜索它,我才知道反引号和单引号之间的区别。不敢相信这么容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2011-11-10
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
相关资源
最近更新 更多