【问题标题】:Incrementing value in PHP script not workingPHP脚本中的递增值不起作用
【发布时间】:2017-03-27 04:32:15
【问题描述】:

我有以下 PHP 脚本来更新我的数据库中的 blog view

<?php   include('header.php');  ?>
<?php
    $article_id = $_POST['article'];
    // echo $article_id;
   $dbhost = 'localhost';
   $dbuser = 'root';
   $dbpass = 'password';
   $con = mysql_connect($dbhost, $dbuser , $dbpass);
   $sql = 'SELECT id,blog_title, blog_body, views FROM tinyblog where id="'. $article_id .'" ';
   // UPDATE VIEWS.
   mysql_query("UPDATE tinyblog SET views = views + 1 WHERE id = {$article_id}" , $con );
      mysql_select_db('tinyblog');
      $retval = mysql_query( $sql, $con );

      if(! $retval ) {
         die('Could not get data: ' . mysql_error());
      }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
   ?>

   <div class="article-blog-indiv">
       <?php    
          echo '<h1>'. $row['blog_title'] .'</h1>';   
        echo '<p>'. $row['blog_body'] .'</p>';
       ?>
   </div>       
<?php           
   }
?>
<?php   include('footer.php');  ?>

实际上更新我数据库中的视图字段的是以下代码行:

mysql_query("UPDATE tinyblog SET views = views + 1 WHERE id = {$article_id}" , $con );

现在这行代码似乎不起作用,因为每次我回去检查phpmyadmin时,我看到views字段仍然是0,但是当我直接插入以下语句来测试我的我的phpmyadmin:

mysql_query("UPDATE tinyblog SET views = views + 1 WHERE id = 1);

我看到视图字段增加了,为什么会这样??

【问题讨论】:

  • 不要使用 mysql_ 函数,它们自 php 5.5.0 起已被弃用
  • 使用mysqli_php.net/manual/en/book.mysqli.php代替mysql_函数,或者更好地使用PDOphp.net/manual/en/book.pdo.php。另外,不要使用 root 用户从应用程序连接到数据库。
  • 你认为views = views + 1 会在$sql 语句中起作用吗?
  • @AniketSahrawat 伙计,对象不是要获得accurate 编号。这里的观点......既不是高效的,......它只是让我的脚本工作! :)

标签: php mysql phpmyadmin


【解决方案1】:

需要解决的一些问题。首先,当您应该使用 mysqli 或 PDO 时,您正在使用 mysql。其次,您正在使用发布数据而根本没有任何转义。第三,您不需要此选择和更新。您可以在一个语句中完成。

$query = "UPDATE tinyblog SET views = views + 1 WHERE id = (SELECT id FROM tinyblog where id=:article)"
$db = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password');
$stmt = $db->prepare($query);
$stmt->execute(array(":article"=>$article_id));

我们在这里所做的是使用一个占位符创建一个准备好的语句。我们已将其命名为 :article,但它本可以保留为 ?

然后在执行查询时需要通过传入参数来填充缺失的位。这就是我们在array(":article"=&gt;$article_id) 的最后一步所做的事情

由于它是一个命名参数,我们使用关联数组。或者,如果您首先调用了bindParam,则可以调用不带任何参数的execute。

【讨论】:

  • 你不能做where id = (select id, blog_title, etc...
  • 抱歉@Dekel 复制粘贴不假思索
  • @e4c5 非常感谢您的帮助,我很感激,如果我被允许使用$stmt-&gt;execute(array(":article"=&gt;$article_id));,还有一个补充问题@最后一行代码到底在做什么?
  • @AlexanderSolonik 它将key :article 绑定到一个实际值。这样sql injection就被阻止了。
  • 很高兴能帮上忙。
【解决方案2】:

除了您已经获得的有关 mysql_ 函数的所有 cmets 之外,bobby tables(您可能很快就会得到)等,请注意您选择您的数据库 在运行查询之前: p>

mysql_query("UPDATE tinyblog SET views = views + 1 WHERE id = {$article_id}" , $con );
mysql_select_db('tinyblog');
  1. 确保在连接后立即选择数据库。
  2. 在您的代码中添加错误处理(如果存在错误,您将看到错误)。

    mysql_query("UPDATE tinyblog SET views = views + 1 WHERE id = {$article_id}" , $con ) or die(mysql_error($con));

【讨论】:

  • Make sure you choose the db right after your connection. 这正是我所做的。没有?
  • 不,不是。请注意,您发送了一个查询 (mysql_query(...)),并且没有选择数据库 (mysql_select_db(..)) 的下一行。
  • 不,这里的意思是你应该在连接后调用 mysql_select_db (就是它的名字,我真的忘记了)。你正在执行一个 seclect 但这与这里的意思不同。或者,您可以将 dbname 传递给连接调用
  • 比我的回答更有礼貌:) +1
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2013-08-14
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
相关资源
最近更新 更多