我有两个班级
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($查询);
}
感谢您的建议
答案 0 :(得分:2)
最好的解决方案是使用PDO_MySQL,这样您就可以prepare和execute查询参数。然后你根本不用担心报价。就这么简单:
$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]."')";