1

我正在尝试使用 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”确实有效。

谢谢。

4

1 回答 1

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 解析

于 2012-08-14T17:04:04.597 回答