PDO语句没有执行?

时间:2012-08-14 17:00:01

标签: php pdo

我正在尝试使用PDO(php数据对象)在.php文件中执行查询,如下所示:

global $db, $table;
$sth = $db->prepare('INSERT INTO $table(user, timerun, magexp, crimsons, blues, golds, greens) VALUES (:user,:timerun,:magexp,:crimsons,:blues,:golds,:greens) ON DUPLICATE KEY UPDATE timerun=timerun+:timerun, magexp=magexp+:magexp, crimsons=crimsons+:crimsons, blues=blues+:blues, golds=golds+:golds, greens=greens+green');
$sth->execute(array(':user' => $user, ':timerun' => $timerun, ':magexp' => $magexp, ':crimsons' => $cr, ':blues' => $bl, ':golds' => $go, ':greens' => $gr));
echo "success";

但是,它实际上并没有更新我的表。我没有收到错误或任何错误。

我做错了什么或PDO不受支持? PDO文档说“注意:有些MySQL表类型(存储引擎)不支持事务。当使用不支持事务的表类型编写事务数据库代码时,MySQL会假装事务已成功启动。此外,任何DDL发出的查询将隐式提交任何待处理的事务。“

我很确定我的MySQL表支持事务,因为常规的'mysql_query'确实有效。

感谢。

1 个答案:

答案 0 :(得分:1)

我不确定你的代码,你在单引号字符串中有变量它不起作用,你应该使用这样的双引号:

global $db, $table; 

$sth = $db->prepare("INSERT INTO $table(user, timerun, magexp, crimsons, blues, golds,  greens) VALUES (:user,:timerun,:magexp,:crimsons,:blues,:golds,:greens) ON DUPLICATE KEY   UPDATE timerun=timerun+:timerun, magexp=magexp+:magexp, crimsons=crimsons+:crimsons, blues=blues+:blues, golds=golds+:golds, greens=greens+green:"); 

$sth->execute(array(':user' => $user, ':timerun' => $timerun, ':magexp' => $magexp, ':crimsons' => $cr, ':blues' => $bl, ':golds' => $go, ':greens' => $gr)); echo "success";

为了安全起见:

首先,我将创建一些关联数组,其中包含项目中所有可能的表作为键,然后使用if(isset($ validTables [$ table])检查变量中的表是否作为数组索引存在,然后继续查询。例如

<?php
  $validTables = array('foo' => true, 'bar' => true, 'other' => true);
  if(isset($validTables[$table])) 
  {
    // query logic here
  }
  else throw new Exception(sprintf('Security error %s table not exists', $table));

检查此代码是因为我编写它而不用php解析