【问题标题】:PHP Transformation from integer to decimalPHP从整数到小数的转换
【发布时间】:2015-03-08 17:11:20
【问题描述】:

我尝试将 php 中值为 0 的整数保存到 miranda db 中的小数(7,2)。

但值为 0 的整数总是保存 99999.99 我找不到解决方案。我认为它可以自动转换。 我在 php 中使用 PDO。

0 以外的其他值效果很好。

我插入的数组:

array(":name"=>"3ld",":urlid"=>($url->id),":date"=>"NOW()",":type"=>"renew",":status"=>($url->alias.$url->custom.".".$url->tld),":price"=>$price)

数组中的变量转储值:

array(6) { [":name"]=> string(3) "3ld" [":urlid"]=> string(1) "1" [":date"]=> string(5) "NOW()" [":type"]=> string(5) "renew" [":status"]=> string(19) "support.url.tld" [":price"]=> int(0) }

代码部分:

$this->db->insert("log_url",array(":name"=>"3ld",":urlid"=>($url->id),":date"=>"NOW()",":type"=>"renew",":status"=>($url->alias.$url->custom.".".$url->tld),":price"=>$price));

数据库插入函数:

    public function insert($table,$parameters=array()){
    $param="";
    $val="";
    $insert= $this->ph($parameters);
    //Build Query
    $query="INSERT INTO {$this->dbinfo["prefix"]}$table";                       
    if(is_array($insert)){
        $count=count($insert);
        $i=0;           
        foreach ($insert as $key => $value) {
            if($parameters[$value]=="NOW()"){
                $val.= "NOW()";
                unset($parameters[$value]);
            }else{
                $val.=$this->quote($value,$parameters);
            }                   
            $param.="`$key`";
            if(++$i != $count) {
                $param.=",";
                $val.=",";
            }               
        }
        $query.=" ($param) VALUES ($val)";
    }       
    $result = $this->db->prepare($query);
    $result->execute($parameters);
    if($this->error_message($result->errorInfo())) {
        $this->query=strtr($query,$parameters);
        $this->db_error=$this->error_message($result->errorInfo());
        exit;
    }
    ++$this->num_queries;
return TRUE;        
}

报价功能:

private function quote($string,$param=''){  
    if(empty($param)){
        return "'$string'";
    }
    return $string;
}

生成占位符函数:

private  function ph(array $a){
    $b=array();
    foreach ($a as $key => $value) {
        $b[str_replace(":", "", $key)]="$key";
    }
    return $b;
}

任何信息都有帮助,谢谢。

更新代码:

public function insert($table,$parameters=array()){
    $param="";
    $val=array();
    $insert= array_keys($parameters); var_dump($parameters);
    //Build Query
    $query="INSERT INTO {$this->dbinfo["prefix"]}$table";

    if(is_array($insert)){

        $query.=' (`'.implode($insert,"`,`").'`) VALUES (:'.implode($insert,', :').')';

        $result = $this->db->prepare($query);

        foreach($parameters as $key=>$param) {
          $result->bindParam(":".$key, ($param['value']=='NOW()')?date('Y-m-d H:i:s'):$param['value'], PDO::PARAM_STR);
        }
    }      

    $result->execute(); //$result->execute($parameters);
    if($this->error_message($result->errorInfo())) {
        $this->query=strtr($query,$parameters);
        $this->db_error=$this->error_message($result->errorInfo());
        exit;
    }
    ++$this->num_queries;
return TRUE;        
}

按 2015.00 的价格生产

【问题讨论】:

  • 请给我们看代码片段
  • 我更新我的问题
  • 那不是代码片段,我连一行代码都没有 :-) 您能否展示一下显示您的逻辑和数据操作的片段? 2-3-5-10行??
  • 不确定问题是什么,您是否尝试转换该变量?
  • 我更新了代码。有一个函数可以插入 DB。价格的变量是整数,但是什么时候是零的问题就存在了。其他值效果很好。

标签: php sql integer decimal


【解决方案1】:

通过删除“:”替换对方法的调用发送“:”没有意义,然后通过->ph()删除该“:”

$this->db->insert("log_url",
    array("name"=>array("value"=>"3ld","type"=>PDO::PARAM_STR), //
      "urlid"=>array("value"=>$url->id,"type"=>PDO::PARAM_STR),
      "date"=>array("value"=>'NOW()',"type"=>PDO::PARAM_STR),     
"type"=>array("value"=>'renew',"type"=>PDO::PARAM_STR),
"status"=>array("value"=>$url->alias.$url->custom.".".$url->tld,"type"=>PDO::PARAM_STR),
"price"=>array("value"=>$price,"type"=>PDO::PARAM_STR)));       //

关于 PDO 类型参数在此处阅读: http://php.net/manual/en/pdo.constants.php 和这里 http://php.net/manual/en/pdostatement.bindparam.php

在你的函数中你可以替换它:

$param="";
    $val="";
    $insert= $this->ph($parameters);
    //Build Query
    $query="INSERT INTO {$this->dbinfo["prefix"]}$table";                       
    if(is_array($insert)){
        $count=count($insert);
        $i=0;           
        foreach ($insert as $key => $value) {
            if($parameters[$value]=="NOW()"){
                $val.= "NOW()";
                unset($parameters[$value]);
            }else{
                $val.=$this->quote($value,$parameters);
            }                   
            $param.="`$key`";
            if(++$i != $count) {
                $param.=",";
                $val.=",";
            }               
        }
        $query.=" ($param) VALUES ($val)";
    }       
    $result = $this->db->prepare($query);

用这个:

$val=array();
$insert= array_keys($parameters);
//Build Query
$query="INSERT INTO {$this->dbinfo["prefix"]}$table";                       
if(is_array($insert)){

    $query.=' (`'.implode($insert,"`,`").'`) VALUES (:'.implode($insert,', :').')';

    $stmt= $this->db->prepare($query);

    foreach($parameters as $key=>$param) {
      //$stmt->bindParam(":".$key, ($param['value']=='NOW()')?date('Y-m-d H:i:s'):$param['value']);
      if($param['value']=='NOW()') {
         $now = date('Y-m-d H:i:s');
         $stmt->bindParam(":".$key, $now, $param['type']); 
      } else {
         $stmt->bindParam(":".$key, $param['value'], $param['type']); 
      }
    }
}       

所以,这必须有效

顺便说一句,别忘了找零:

 $result->execute($parameters);

 $stmt->execute();

在那儿……

【讨论】:

    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2020-04-21
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多