【问题标题】:Prepared SQL statement not 'preparing'准备好的 SQL 语句未“准备”
【发布时间】:2015-01-23 02:44:45
【问题描述】:

我正在尝试制作一个可以在所有网站上使用的基本计数器。

我有一个查询我的 Go Daddy MySQL 服务器和我的 MAMP MySQL 服务器的准备好的语句,并且该语句不会“准备”。这里是:

function hit_counter($url){
        if($mysqli = new mysqli('localhost', 'root', '',    'DB')){
        $crack = "SELECT hc-id, hc-url, hc-unique_hits, hc-total_hits, hc-last_viewed FROM hit_counter WHERE hc-url =?";
        if($stmt = $mysqli->prepare(crack)){
            $stmt->bind_param('s', $url);
            $stmt->execute();
            $stmt->store_result();
            $stmt->bind_result($id, $url, $unique_hits, $total_hits, $last_viewed);
            $stmt->fetch();
            echo "the statement was prepared successfully";
        $total_hits = $total_hits+1;
        $last_viewed = date('l jS \of F Y h:i:s A');
        echo $unique_hits;
        if($unique === true){
            $unique_hits = $unique_hits+1;
        }

        $update = 'UPDATE hit_counter set hc-unique_hits=? hc-total_hits=? hc-last_viewed=? WHERE hc-url=?';
            if($stmt= $mysqli->prepare($update)){
            $stmt->bind_param('iiss', $unique_hits, $total_hits, $last_viewed, $url);
            $stmt->execute();
            }else{echo "the update statement wasn't prepared.";}
    }else{echo "The statement wasn't prepared.";}
  }else{echo "the SQL connection wasn't made";}
}

我知道它正在连接到数据库,但是每当我运行脚本时,它都会回显 if($stmt = $mysqli->prepare(crack)){ "The Statement wasn't prepared" 的 else 语句。

【问题讨论】:

  • SET 语句之间需要逗号,set hc-unique_hits=?, hc-total_hits=?,...
  • 存在一个特定的已知问题,因此这并不是真正的代码审查。但是,将来如果您确实需要代码审查,可以使用 separate Stack Exchange site for that
  • 启用错误报告...(对于 PDO 和 PHP)
  • 您的“Go Daddy SQL Server” - 您是指 Microsoft SQL Server 还是 MySQL?
  • (我已经删除了代码审查的请求 - 我认为问题本身就是主题,因为它与特定问题有关。最好不要在这里请求代码审查,因为它听起来也是一般,并且可以解决一个本来很好的问题)。

标签: php mysql sql


【解决方案1】:

您的列包含连字符,MySQL 将其解释为 hc MINUS unique_hits 等。认为您想做一个数学问题。

您的 SET 中也缺少逗号

UPDATE hit_counter set `hc-unique_hits`=?, `hc-total_hits`=?, `hc-last_viewed`=? WHERE `hc-url`=?

最好不要在列名中使用连字符。请改用下划线。

使用

if(!$stmt->execute()){trigger_error("there was an error....".$mysqli->error, E_USER_WARNING);}

会发现那个错误。

同样的事情

$crack = "SELECT hc-id, hc-url, hc-unique_hits, hc-total_hits, hc-last_viewed FROM hit_counter WHERE hc-url =?";

在包含连字符的周围使用反引号。

$crack = "SELECT `hc-id`, `hc-url`, `hc-unique_hits`, `hc-total_hits`, `hc-last_viewed` 
FROM hit_counter WHERE `hc-url` =?";

有关标识符限定符的更多信息,请咨询:

还有

if($stmt = $mysqli->prepare(crack)){

应该是

if($stmt = $mysqli->prepare($crack)){

您错过了$crack。否则,它被视为一个常量。


在文件顶部添加错误报告,这将有助于发现错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告应该只在暂存阶段完成,而不是在生产阶段。

您可以使用的另一个开发工具是var_dump()

使用var_dump($variable_to_check); 来查看通过与否。

【讨论】:

  • 非常感谢弗雷德!如果我有更多代表,我会投票赞成您的答案!它有效!
  • @luckybroman5 不客气。更好的是,接受答案 ;-) 干杯! - 只需勾选我的答案旁边的复选标记,直到它变成绿色。这会将其标记为已解决。
  • @luckybroman5 以下是meta.stackexchange.com/a/5235 在该页面上的外观,然后返回此处并执行相同操作。
  • @luckybroman5:如果这个答案有帮助,请考虑接受它。
【解决方案2】:

看到if($stmt = $mysqli-&gt;prepare(crack)){的值应该是

$crack,发现 $ !!

【讨论】:

  • 是的.. 那是复制和粘贴。在我的原始代码中,$ 在那里。不过谢谢!