我有一个mysqli查询与以下代码:
$db_usag->query("UPDATE Applicant SET phone_number ='$phone_number',
street_name='$street_name', city='$city', county='$county', zip_code='$zip_code', day_date='$day_date', month_date='$month_date',
year_date='$year_date' WHERE account_id='$account_id'");
Run Code Online (Sandbox Code Playgroud)
但是,所有数据都是从HTML文档中提取的,所以为了避免错误,我想使用预准备语句.我找到了PHP文档,但没有UPDATE示例
我这两个功能之间的混淆Bindvalue()和BindParam()
%和_,所以使用时要小心LIKE.所以我认为BindValue()在使用LIKE查询时不会使用.LIKE查询时BindParam().因为我知道BindParam可以逃避这些%和_.BindValue()没有防止sql注入.我不确定这个,是真的吗?朋友告诉我在这3点中提到的是对还是错.我是PDO的初学者所以请清楚解释一下..
我正在使用带有Postgresql后端的PHP PDO.我有一个表有一些可以为空的字段,当用户在HTML表单字段中没有输入任何内容时,我想在该字段中插入NULL,而不是空字符串(这很重要,因为这些表中的一些SELECT稍后会使用条件等as WHERE x IS NOT NULL).
但是,此版本的bindParam代码会将空字符串插入可为空的字段而不是NULL.
$stmt2->bindParam(':title', $title, PDO::PARAM_STR);
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多,并且发现这是将null插入字段的答案:
$stmt2->bindParam(':title', $title, PDO::PARAM_NULL);
Run Code Online (Sandbox Code Playgroud)
但这意味着我需要预先检查所有传递给可空字段的参数,以确定它们是否为空,如果是,则传递PDO :: PARAM_NULL而不是PDO_PARAM_STR.我当然可以这样做,但希望可能有一个设置只会告诉PDO它是否遇到空字符串,而是插入null.
我偶然发现了这个
$this->dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);
Run Code Online (Sandbox Code Playgroud)
但它没有任何效果,经过进一步的研究,我认为这只影响出路的记录,而不是在路上.
除了预先检查变量之外的任何选项?
谢谢亚伦
$resultSpendStmt = $connection->prepare(...);
$array->bind_param("sdidi", $A, $B, $C, $D, $E);
$array->execute();
$array->store_result();
$array->bind_result($F, $G, $H, $I, $J, $K);
Run Code Online (Sandbox Code Playgroud)
我仍然不确定bind_param是做什么的.有人能给我一个关于什么意思的例子吗?
在我看来,我有一个类似这样的查询:
$sort = isset($sort) ? sanitize($_sort) : 'id';
if ($result = $link->prepare("
SELECT id, price
FROM items
ORDER BY ?
"))
{
$result->bind_param("s", $sort);
$result->execute();
etc...
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码块而不设置排序变量时,它运行没有与使用?相关的错误?在ORDER BY子句中,结果集显示在带有"ORDER BY id"的结果集中.
这是一个问题:
现在,如果我将sort变量设置为"price ASC"之类的东西,我仍然会得到一个似乎是"ORDER BY id"而不是"ORDER BY price ASC"的结果集.
当我在phpmyadmin中作为查询运行查询时,如果我以这种方式定义查询,它将根据"价格ASC"返回正确的结果集.
现在,如果我改变代码并像这样运行它:
$sort = isset($sort) ? sanitize($_sort) : 'id';
if ($result = $link->prepare("
SELECT id, price
FROM items
ORDER BY $sort
"))
{
$result->execute();
etc...
}
Run Code Online (Sandbox Code Playgroud)
它运行正常,结果集与我在phpmyadmin中的查询相同...
有人可以告诉我这里究竟发生了什么,以及为什么查询不能像我最初使用bind_param那样运行.
在我看来,它应该工作,因为没有出现与此类使用相关的错误......但在实践中,它似乎不适用于ORDER BY子句.它几乎就像在运行bind_param时没有翻译sort变量一样.
感谢您阅读我的问题,任何有关它的输入将不胜感激!
编辑:
对任何感兴趣的人
if (isset($sort))
{
$acceptableSortValues = array('name', 'price ASC', …Run Code Online (Sandbox Code Playgroud) 现在我不得不使用以下结构来处理将多个参数绑定到mysqli查询中:
if ($words_total == 1)
{
$statement -> bind_param("s", $words[0]);
}
else if ($words_total == 2)
{
$statement -> bind_param("ss", $words[0], $words[1]);
}
else if ($words_total == 3)
{
$statement -> bind_param("sss", $words[0], $words[1], $words[2]);
}
//and so on....
Run Code Online (Sandbox Code Playgroud)
我使用下面的代码计算出问号的数量并将其插入到我的查询中:
$marks = "";
for($i = 1; $i<=$words_total; $i++) {
if ($i == $words_total)
{
$marks .= "?";
}
else
{
$marks .= "?,";
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题肯定是必须有一种方法来处理我需要动态的查询中的尽可能多的输入.对bind_param()进行硬编码似乎是一种非常糟糕的处理方式.
我使用的是PHP版本5.4.10
我不能让这个工作.我现在已经花了很多时间.
这有效:
$mysqli = new mysqli("localhost", "root", "root", "db");
if(!$mysqli || $mysqli->connect_errno)
{
return;
}
$query_str= "SELECT name FROM table WHERE city IN ('Nashville','Knoxville')";
$query_prepared = $mysqli->stmt_init();
if($query_prepared && $query_prepared->prepare($query_str))
{
$query_prepared->execute();
Run Code Online (Sandbox Code Playgroud)
但是我不能让它与这样的bind_param一起工作:
$query_str= "SELECT name FROM table WHERE city IN (?)";
$query_prepared = $mysqli->stmt_init();
if($query_prepared && $query_prepared->prepare($query_str))
{
$cities= explode(",", $_GET['cities']);
$str_get_cities= "'".implode("','", $get_cities)."'"; // This equals 'Nashville','Knoxville'
$query_prepared->bind_param("s", $cities);
$query_prepared->execute();
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我也试过call_user_func_array,但似乎无法使语法正确.任何帮助将不胜感激!
编辑:我已经严格尝试了moskito-x的建议和大量的例子列在这里以及其他在SO和随机网站上,没有任何作品.我认为问题可能是PHP 5.4,这就是我的MAMP现在设置的.
我正处于这样一种情况,我想构建一个$bindParam以这种格式变量的代码:
$bindParams = [$type1 => $param1, $type2 => $param2, ... ]
Run Code Online (Sandbox Code Playgroud)
我想构建一些代码,动态地将这些参数添加到预准备语句中.
这是我到目前为止构建的代码:
$mysql = new mysqli("localhost", "root", "", "db1");
$stmt = $mysql->prepare($sql);
foreach($bindParams as $type => $data) {
$stmt->bind_param($type, $data);
}
$stmt->execute();
$result = $stmt->get_result();
// and after perhaps twiddling with the result set, but this is not the case .....
Run Code Online (Sandbox Code Playgroud)
对于你的实例
$sql = "INSERT INTO table1 (name, age) VALUES (?,?);"
Run Code Online (Sandbox Code Playgroud)
和
$bindParams = ["s" => "hello", "i" => 15]
Run Code Online (Sandbox Code Playgroud)
这并不总是有这样的结构,它可以改变为例如$bindParams = ["s" => "hello", "i" …
指定 mysqli bind_param 类型的优点和缺点是什么i,d,s,b?
我将 UNIX 时间戳存储在数据类型为 INT 的数据库列中。在我准备好的语句中,我将其设置为bind_param('s',$timestamp);并且它存储该值没有任何问题。s那么我使用而不是在i期间产生了什么影响bind_param?
bindparam ×10
php ×10
mysqli ×7
pdo ×3
bindvalue ×2
mysql ×1
null ×1
postgresql ×1
sql-order-by ×1