php更新到mysql,数组没有更新

I have a function that should be updating a row, no errors what so ever in the logs. From what I see it should be working. I took the function from a update user function and tried to mimic it for the new feature.

Here is the data array posting to it.

$data = array('id' =>  $vid, 'name' => $vname, 'logo' => $vlogo, 'info' => $vinfo, 'site' => $vsite, 'est' => $vest);

The post works, I am doing a dump on the updatecompany page. So they do get set. I think it may be with the function. Any insight would be wonderful!

public static function updateCompany($toUpdate = array(), $company = null){
  self::construct();
   if( is_array($toUpdate) && !isset($toUpdate['id']) ){
    if($company == null){
    echo "No company ID set!";
  }
  $columns = "";
  foreach($toUpdate as $k => $v){
    $columns .= "`$k` = :$k, ";
  }

  $sql = self::$dbh->prepare("UPDATE companys SET {$columns} WHERE `id` = :id");
  $sql->bindValue(":id", $company);
  foreach($toUpdate as $key => $value){
    $value = htmlspecialchars($value);
    $sql->bindValue(":$key", $value);
  }
  $sql->execute();

  }else{
  return false;
 }
}



$vid = $_POST["idnum"];
$vname = $_POST["name"];
$vlogo = $_POST["logo"];
$vinfo = $_POST["info"];
$vsite = $_POST["site"];
$vest = $_POST["est"];

Your update SQL could not work because you have comma in update value set.

See, you attached comma without any consideration:

  $columns = "";
  foreach($toUpdate as $k => $v){
    $columns .= "`$k` = :$k, ";
  }

Then the final SQL will look something like this:

UPDATE companys SET `name`=:name, `logo`=:logo, WHERE `id`=:id

Do you notice the comma just before WHERE? it should not be there!

So you should update the code like following:

$columns = "";
foreach($toUpdate as $k => $v){
  if ($columns != "") $columns .= ",";
  $columns .= "`$k` = :$k ";
}

This should be working.

I would maybe try using the bind array into your execute() method since you are just binding the values (I assume this is PDO). Another feature is to use an array to assemble the column portions and implode at the time of use.

public static function updateCompany($toUpdate = array(), $company = null)
    {
        # Also this may supposed to be: self::__construct(); ?? Notice the "__" before "construct"
        self::construct();

        if(is_array($toUpdate) && !isset($toUpdate['id'])) {
            if(empty($company)){
                # Throw exception, catch it in a parent wrapper
                throw new \Exception("No company ID set!");
                # Stop, no sense in continuing if an important part is missing
                return;
            }

            foreach($toUpdate as $k => $v){
                $bKey        = ":{$k}";
                # I would create a bind array here
                $bind[$bKey] = $value;
                # I generally save to an array here to implode later
                $columns[]   = "`{$k}` = {$bKey}";
            }
            # Add the id here
            $bind[":id"] = $company;
            # I would use a try here for troubleshooting PDO errors
            try {
                # Create sql with imploded columns
                $sql = self::$dbh->prepare("UPDATE companys SET ".implode(",",$columns)." WHERE `id` = :id");
                # Throw the bind array into the execute here
                $sql->execute($bind);
            }
            catch(\PDOException $e) {
                # I would only die here to see if there are any errors for troubleshooting purposes
                die($e->getMessage());
            }
        } else {
            return false;
        }
    }

or to no need to be aware of last comma try this:

$columns = array();
foreach($toUpdate as $k => $v){
    $columns[] = "`$k` = :$k";
}

$sql = self::$dbh->prepare("UPDATE `companys` SET ".implode(',', $columns)." WHERE `id` = :id");