准备好的SQL语句没有'准备'

时间:2015-01-22 18:06:44

标签: php mysql sql

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

我有一个准备好的语句查询我的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语句。

2 个答案:

答案 0 :(得分:3)

您的列包含连字符,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)){

您错过了$的{​​{1}}。否则,它被视为常数。


将错误报告添加到文件的顶部,这有助于查找错误。

crack

旁注:错误报告应仅在暂存时完成,而不是生产。

另一种可供您使用的开发工具是var_dump()

使用<?php error_reporting(E_ALL); ini_set('display_errors', 1); // rest of your code 查看通过的内容。

答案 1 :(得分:1)

请参阅值if($stmt = $mysqli->prepare(crack)){

$crack,发现 $ !!