我从某个地方修改了这段代码,但我不确定我是否正确地执行了此操作,
我使用方法将数据插入数据库,
# insert or update data
public function query($query, $params=array())
{
try
{
$stmt = $this->connection->prepare($query);
$params = is_array($params) ? $params : array($params);
$stmt->execute($params);
return true;
}
catch (PDOException $e)
{
# call the get_error function
$this->get_error($e);
}
}
然后我只需要这样称呼它,
$sql = "
INSERT root_countries_cities_towns (
tcc_names,
cny_numberic,
tcc_created
)VALUES(
?,
?,
NOW()
)";
$pdo->query($sql,array('UK','000'));
完美无缺!但我不明白这条线的作用 - 有人可以解释一下吗?
$params = is_array($params) ? $params : array($params);
我认为我必须首先使用bindParam
来绑定参数,但似乎我不再需要使用is方法 - 是否安全可靠?
这是否意味着我不再需要以这种方式准备查询了?
$sql = "
INSERT root_countries_cities_towns (
tcc_names,
cny_numberic,
tcc_created
)VALUES(
:name,
:numberic,
NOW()
)";
忘了这个绑定?
$stmt = bindParam(':name','UK', PDO::PARAM_STR);
$stmt = bindParam(':numberic','000', PDO::PARAM_STR);
感谢。
答案 0 :(得分:3)
行
$params = is_array($params) ? $params : array($params);
只是检查$ params变量是否是一个数组,如果是这样,它会创建一个原始$ params值作为唯一元素的数组,并将该数组赋值给$ params。
这将允许您为查询方法提供单个变量,或者如果查询具有多个占位符,则提供变量数组。
它不使用bindParam的原因是因为值被传递给execute()方法。使用PDO,您可以使用多种方法将数据绑定到占位符:
bindParam方法的一大优点是,如果循环数据数组,可以调用bindParam一次,将占位符绑定到特定的变量名称(即使该变量尚未定义),它将会每次执行语句时都获取指定变量的当前值。
答案 1 :(得分:3)
我猜这几乎是PHP语法问题而不是PDO问题。
$params = is_array($params) ? $params : array($params);
是
的短地(称为三元运算符))if (is_array($params)) {
$params = $params;
} else {
$params = array($params);
}
我宁愿写为
if (!is_array($params)) $params = array($params);
这是非常不言自明的,几乎可以用简单的英语阅读:
如果$ params不是一个数组,那么让我们使用一个前$ params的值使它成为数组
这就是为什么我讨厌三元运算符(和lambdas)并且总是避免使用它。它使相当可读的代码陷入混乱。只是出于程序员的懒惰。
要回答您的其他问题,
这是否意味着我不再需要以这种方式准备查询了?
谁说的?您正在代码中准备好它,再次检查它。
忘了这个绑定?
这是真的。 execute($params)
只是另一种绑定变量的方法。
答案 2 :(得分:1)
第一个示例将$params
的内容转换为数组(如果它还不是数组)(例如,如果只传递了一个参数并且它作为单个项而不是数组传递长度1)。
这两个示例同样有效,除了对于第一个示例,引入数组$params
的参数被注入到SQL查询中找到?
的位置,而在第二个示例中,参数的格式化实际上是通过名称完成的(您将在sql中找到的参数名称绑定到实际参数)。
你应该使用第一个,写起来更容易。
答案 3 :(得分:0)
将数组传递给PDOStatement::execute()
使用默认值(绑定类型等)通过PDOStatement::bindParam()
(或者bindValues()
)传递数组中的每个条目。
基本上,它与预绑定一样安全。
使用bindParam
的优点是它绑定到变量引用。这意味着您可以在不重新绑定的情况下更改变量的值,并使用新值执行该语句。这在循环中特别有用,例如
$vals = array('foo', 'bar', 'baz');
$stmt->bindParam(1, $val);
foreach ($vals as $val) {
$stmt->execute(); // Executes once for each value in $vals
}
我不明白这条线的作用 - 有人可以解释一下吗?
该行将非数组转换为数组。
例如
$params = 'foo';
$params = is_array($params) ? $params : array($params);
$params == array('foo');
我想这是为了方便你只有一个占位符和一个要绑定的值的情况,因为PDOStatement::execute()
只能传递一个数组。
答案 4 :(得分:-2)
试试这堂课。我经常使用PDO,这是我一直用于我的项目。PHP PDO Class on GitHub