【问题标题】:SQL Query using PHP PDO使用 PHP PDO 的 SQL 查询
【发布时间】:2013-01-18 19:03:19
【问题描述】:

我正在尝试使用 PHP 创建一个 SQL 查询,在该查询中它检查是否已经使用相同的日期和用户名提交/设置了一行。如果没有,它会插入一个新行。如果确实找到匹配项,则改为更新该行。

我可以很好地插入新行,但是当我使用预先存在的日期和名称时,我的任何日志中都没有收到错误,并且查询似乎运行没有任何问题。但是在检查数据库时,我注意到该行实际上没有设置 UPDATES。当我在 SQL 中手动运行更新命令时,它似乎工作正常。

没有日志/错误数据可以继续,我希望在这里得到一些建议。我敢肯定这里一定有我遗漏的东西。这是我目前正在使用的:

require_once 'db-conn.php';

$name = $_POST['name'];
$email = $_POST['email'];
$date = $_POST['date'];
$var1 = $_POST['var1'];
$var2 = $_POST['var2'];
$var3 = $_POST['var3'];
$var4 = $_POST['var4'];

$conn = db_connect (); 
$sqlq = "SELECT * FROM tbl WHERE date = '$date' AND name = '$name'"; 
$nRows = $conn->query("$sqlq")->fetchColumn();

if ($nRows==0) {
try {
  $sqli = "INSERT INTO tbl (name,email,date,var1,var2,var3,var4) VALUES (:name,:email,:date,:var1,:var2,:var3,:var4)";
   $sql = $conn->prepare("$sqli");
   $sql->execute(array(':name' => $name, ':email' => $email, ':date' => $date, ':var1' => $var1, ':var2' => $var2, ':var3' => $var3 ':var4' => $var4));
 } catch(PDOException $e) {
   die ('SQL Error');
   }
 }
else {
 try {
  $sqli = "UPDATE tbl SET email='$email', notes='$notes', var1='$var1', var2='$var2', var3='$var3' WHERE date='$date' AND name='$name'";
  $sql = $conn->prepare("$sqli");
  $sql->execute(array($name, $email, $date, $var1, $var2, $var3, $var4));
} catch(PDOException $e) {
  die ('SQL Error');
}

}

【问题讨论】:

  • 小心你的 SELECT 语句;您直接输入两个未经处理的变量。我也会准备该语句。

标签: php sql pdo percona


【解决方案1】:

你没有正确的绑定变量:

$sqli = "UPDATE tbl SET email=:email, notes=:notes, var1=:var1, var2=:var2, var3=:var3 WHERE date=:date AND name=:name";
$sql = $conn->prepare("$sqli");
$sql->execute(array(':name' => $name, ':email' => $email, ':date' => $date, ':var1' => $var1, ':var2' => $var2, ':var3' => $var3, ':notes'=>$notes));

您在插入语句中正确,但在更新中没有。

不知道你从哪里得到$notes

另外不确定它是否是故意的,但您没有在更新查询中更新 var4。

【讨论】:

  • 我忘了用 $var# 屏蔽 $notes :)。在这里发帖时,我倾向于掩盖我独特的 var 名称,呵呵。我将尝试在变量为我的 UPDATE 查询限定的地方进行更改。谢谢!
  • 我已更新我的查询以包含绑定变量,但 PDOException 在运行 UPDATE 查询时报告以下内容:异常 'PDOException' 带有消息 'SQLSTATE[HY093]: Invalid parameter number' in temp.html堆栈跟踪:#0 temp.html(34): PDOStatement->execute(Array) #1 temp-php.php(18): include('/xxx/xxx/incl...') #2 {main}
  • 这意味着:variables$sqli 的数量与execute() 上的数组中发送的变量数量不匹配,请确保它们匹配。
  • 我已经绑定了变量,但我遇到的一个大问题是 WHERE date=:date 和 name=:name 不起作用,但在使用未经处理的变量时确实起作用。我会将您的答案标记为正确,但在此之前,有什么关于为什么会这样的建议吗?我的 SQL 查询似乎没有用经过清理的变量替换 :name 和 :date。
  • 看起来问题是两个变量 :date 和 :name 在一个查询中重复。我能够从 UPDATE 查询中删除这些,并且效果很好。用户将无法更新日期或名称,但不需要特别更改这些变量。非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多