-1

我无法更新 mySQL 表中的值。在我下面的代码中,option格式为[["test",0],["opt",0]]. 我想将其更新为[["test",1],["opt",0]]

<?php
if (isset($_POST['submit']))
{ 
$opt=$_POST['xyz'];
mysql_connect("localhost","root","");
 mysql_select_db("test"); 
 $sqlstmt="select * from polls where question='".$_POST['name']."' ";
$abc = mysql_query($sqlstmt); 
$rw=mysql_fetch_array($abc);
$opts = json_decode($rw['option']);


 for($i=0;$i<sizeof($opts);$i++)
 {
//$sqlstmt="select * from polls where question='".$_POST['name']."' and opton=$opt";

   if($opt==$opts[$i][0])
   {
  $opts[$i][1]+=1;
  echo $opts[$i][1];

    }

}
var_dump($opts);

$a=json_encode($opts);
  $b="UPDATE  polls
  SET option="$a", 
  WHERE question='".$_POST['name']."'";
  var_dump($_POST['name']);
  $c=mysql_query($b);
 var_dump($c);
} 

我不知道我哪里出错了,但var_dump($c)正在返回布尔值false

4

3 回答 3

3

首先..您应该使用 PDO 而不是已弃用的 mysql_* 函数...您的代码存在重大安全漏洞!!!

http://php.net/manual/en/book.pdo.php

但是,要回答您的问题...您的问题是 $a 的串联所以只需更改为...

$a=json_encode($opts);
$b="UPDATE  polls SET option='".$a."' 
WHERE question='".$_POST['name']."'";
$c=mysql_query($b);
var_dump($c);
} 

更新/编辑 这是您的完整代码,带有 PDO,以确保安全

你显然必须编辑你的连接信息,我还没有测试过这个,但是 PDO 比不推荐使用的 mysql_* 函数更好,所以你去......

$dbname = "test";
$hostname = "localhost";
$pw = "root";
$username = "";

if (isset($_POST['submit']))
  { 
   $opt=$_POST['xyz'];

  $pdo = new PDO ("mssql:host=$hostname;dbname=$dbname","$username","$pw");
  try{
  $query = $pdo->prepare("select * from polls where question=:question");
  $query->execute(array(':question' => $_POST['name']));
  $rw = $query->fetchAll(PDO::FETCH_ASSOC);
  } catch(PDOException $ex) {
  //whatever error handling you want
  echo "An Error occured!"; 
  some_logging_function($ex->getMessage());
  }

  $opts = json_decode($rw['option']);

  for($i=0;$i<sizeof($opts);$i++)
  {
   if($opt==$opts[$i][0])
  {
  $opts[$i][1]+=1;

}

$a=json_encode($opts);
try { 
$query = $pdo->prepare("UPDATE  polls
SET option=? WHERE question=?");
$query->execute(array($a, $_POST['name']));
} catch(PDOException $ex) {
  //whatever error handling you want
  echo "An Error occured!"; 
  some_logging_function($ex->getMessage());
}
于 2013-06-10T06:02:18.113 回答
0

有几个问题;最重要的是有易受攻击的代码:

$sqlstmt="select * from polls where question='".$_POST['name']."' ";

这是危险代码,因为它打开了SQL 注入攻击的代码。您至少应该转义任何用户输入:

$sqlstmt = sprintf("select * from polls where question='%s'",
    mysql_real_escape_string($_POST['name'])
);

此外,更新语句在 PHP和MySQL中都有解析错误。这是修复:

$b = sprintf("UPDATE polls SET `option`='%s' WHERE question='%s'",
    mysql_real_escape_string($a),
    mysql_real_escape_string($_POST['name'])
);

请注意,这option是 MySQL 中的保留字,因此必须用反引号括起来。

推荐

我建议您阅读mysqliPDO并采用准备好的语句作为防止最常见的 SQL 注入攻击的方法。

于 2013-06-10T06:19:53.727 回答
-1

改变 -

  $b="UPDATE  polls
  SET option="$a", 
  WHERE question='".$_POST['name']."'";

$b="UPDATE  polls SET option='".$a."' WHERE question='".$_POST['name']."'";

根据JACK的建议..上面的代码对 SQL 注入是开放的..所以在实际实施之前先把它拿走。

在此处阅读流行的帖子以处理 sql 注入

于 2013-06-10T06:02:28.333 回答