双引号内的类数组

时间:2010-09-29 18:39:06

标签: php mysql

我有两个班级

class A  
{     
    ....  
protected  $arr = array('game_id','pl_id');  
...  
}   
class B extends A   
{  
    //for example here add method   
   private function add_to_DB()    
  {   
      $query = "INSERT INTO TABLE(game_id,player_id)    
                     VALUES(????,????)";   //Here is my question,what I must to write??
mysql_query($query);
}  
}

我尝试写..VALUES(\"$this->arr[game_id]\",\"$this->arr[pl_id]\")"
VALUES(".$this->arr[game_id].",".$this->arr[pl_id].")" ,但它不起作用。

感谢您的任何建议

我想我找到了另一个问题的解决方案。 在我的A班,我必须要_ 设置和_ 获取方法  A类
    {
        ....
    protected arr = array('game_id'=> NULL,'pl_id'=> NULL);

    function __set($property, $value)  
 {  
     if (array_key_exists($property, $this->arr)) {  
         $this->arr[$property] = $value;  
     } else {  
         print "Error: Can't write a property other than x & y\n";  
     }
 }


  function __get($property)
  {
      if (array_key_exists($property, $this->arr)) {
           return $this->arr[$property];
      } else {
          print "ERROR: write correct property";
      }
  }

...  
}  

在B级之后,我可以写下面的

私人功能add_to_DB()
 {
        $ query =“INSERT INTO TABLE(game_id,player_id)
                       VALUES(\“$ this-> game_id \”,\“$ this-> pl_id \”)“; //这是我的问题
     的mysql_query($查询);
}

感谢您的建议

3 个答案:

答案 0 :(得分:2)

最好的解决方案是使用PDO_MySQL,这样您就可以prepareexecute查询参数。然后你根本不用担心报价。就这么简单:

$stmt = $pdo->prepare("INSERT INTO TABLE (game_id, player_id) 
                       VALUES (:game_id, :pl_id)");
$stmt->execute($this->arr);

PHP的普通MySQL扩展不支持SQL查询中的参数。如果您必须继续使用该API,则至少应使用一些技术来防范SQL Injection。例如,如果它们是整数,那么强制转换为int:

$g = (int) $this->arr["game_id"];
$p = (int) $this->arr["pl_id"];
$query = "INSERT INTO TABLE(game_id,player_id) VALUES({$g}, {$p})";
mysql_query($query);

如果它们是字符串,则必须使用提供的函数转义值:

$g = mysql_real_escape_string($this->arr["game_id"]);
$p = mysql_real_escape_string($this->arr["pl_id"]);
$query = "INSERT INTO TABLE(game_id,player_id) VALUES('{$g}', '{$p}')";
mysql_query($query);

还记得引用你的数组键,否则它们将被解释为PHP常量,而不是字符串。

答案 1 :(得分:1)

只需使用sprintf作为可读性和类型转换的更好

$query = "INSERT INTO TABLE(game_id,player_id) VALUES('%d','%d')";
$query = sprintf($query,$this->arr['game_id'],$this->arr['pl_id']);
mysql_query($query);

查阅手册,了解您应该使用什么以及如何使用sprintf,%d用于数字/整数,%s用于字符串,如果您使用字符串,则还必须确保使用关于防止SQL注入的值的mysql_eral_escape_string

重新审视你的问题我认为你关于扩展对象等等,那么让我向你展示这个例子吗?

class FirstClass
{
    protected $var = "FirstClass";
}

如果你像这样扩展这个类:

class SecondClass extends FirstClass
{
    public function aMethod()
    {
        echo $this->var;
    }
}

这将回应类中的字符串,但如果我要执行以下操作

class ThirdClass extends FirstClass
{
    protected $var = "ThirdClass";

    public function aMethod()
    {
        echo $this->var;
    }
}

这会回显ThirdClass,因为你已经覆盖了第一个变量,所以只要你不覆盖父类中的变量就可以使用$ this,就好像它是你的子类的一个成员一样

答案 2 :(得分:0)

尝试

$query = "INSERT INTO TABLE(game_id,player_id)    
                     VALUES('".$this->arr[0]."','".$this->arr[1]."')";