我有一个PDO的问题,我很想在被它困扰很长一段时间后得到答案.
举个例子:
我将一个ID数组绑定到PDO语句,以便在MySQL IN语句中使用.
该数组将是:$ values = array(1,2,3,4,5,6,7,8);
数据库安全变量是$ products = implode(','$ values);
因此,$ products将成为STRING,其值为:'1,2,3,4,5,6,7,8'
声明如下:
SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN (:products)
Run Code Online (Sandbox Code Playgroud)
当然,$产品将被声明为:产品.
但是,当编译语句并绑定值时,它实际上看起来像这样:
SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN ('1,2,3,4,5,6,7,8')
Run Code Online (Sandbox Code Playgroud)
问题是它将IN语句内部的所有内容作为单个字符串执行,因为我已将其准备为逗号分隔值以绑定到语句.
我真正需要的是:
SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN (1,2,3,4,5,6,7,8)
Run Code Online (Sandbox Code Playgroud)
我实际上可以实现这一点的唯一方法是将值放在字符串本身而不绑定它们,但我知道必须有一种更简单的方法来执行此操作.
我正在使用PDO执行一个带有IN子句的语句,该子句使用数组作为它的值:
$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (".$in_values.")");
$my_result->execute();
$my_results = $my_result->fetchAll();
Run Code Online (Sandbox Code Playgroud)
上面的代码完全正常,但我的问题是为什么这不是:
$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)");
$my_result->execute(array(':in_values' => $in_values));
$my_results = $my_result->fetchAll();
Run Code Online (Sandbox Code Playgroud)
此代码将返回my_value等于$in_array(1)中第一项的项,但不返回数组中的其余项(2和3).
我有和两个值的数组,我想在选择查询中使用它与sql IN运算符.
这是我桌子的结构
id comp_id
1 2
2 3
3 1
Run Code Online (Sandbox Code Playgroud)
我有一个$arr有两个值的数组Array ( [0] => 1 [1] => 2 )
我想获取comp_id 1和comp_id 2的记录.所以我编写了以下查询.
SELECT * from table Where comp_id IN ($arr)
Run Code Online (Sandbox Code Playgroud)
但它不会返回结果.
如何在Laravel 4中转义传递给原始查询的参数?我期待类似的东西DB::escape()(从Laravel 3响起铃声)并尝试DB::quote()(我认为可以通过PDO对象获得)
$query = DB::select("SELECT * FROM users WHERE users.id = " . DB::escape($userId));
Run Code Online (Sandbox Code Playgroud)
我们不能将select方法与占位符一起使用,因为上面只是我们尝试实现的简化示例.我们有一个大型自定义查询,其中包含一些无法适应查询构建器的嵌套选择查询.
插入Laravel 4之前逃避某些事情的最佳方法是什么?
编辑:
我刚刚发现你可以访问PDO对象并以这种方式使用quote函数.这仍然是最好的方法,还是有更简单的方法来访问此功能?
DB::connection()->getPdo()->quote("string to quote");
Run Code Online (Sandbox Code Playgroud) 我正在修改一些PHP代码以使用PDO进行数据库访问,但我遇到了"WHERE ... IN"查询的问题.
我试图从数据库中删除一些东西,根据表格上的哪些项目进行检查.列表的长度和内容会有所不同,但是对于这个例子,想象一下:
$idlist = '260,201,221,216,217,169,210,212,213';
Run Code Online (Sandbox Code Playgroud)
然后查询如下所示:
$query = "DELETE from `foo` WHERE `id` IN (:idlist)";
$st = $db->prepare($query);
$st->execute(array(':idlist' => $idlist));
Run Code Online (Sandbox Code Playgroud)
当我这样做时,只删除第一个ID.(我假设它抛出了逗号和之后的所有内容.)
我也试过制作$idlist一个数组,但它不删除任何东西.
在PDO准备好的声明中使用项目列表的正确方法是什么?
我的代码:
$myArray = implode($myArray, ',');
$sth = $dbh->prepare('SELECT foo FROM bar WHERE ids IN (:ids)');
$sth->bindParam(':ids', $myArray);
$sth->execute();
$result = $sth->fetch();
echo $sth->rowCount();
Run Code Online (Sandbox Code Playgroud)
始终显示计数为1,但是当我跳过参数化并只是将变量本身添加到其中时,我得到一个准确的计数.这里发生了什么?
我有一个表单,它是一个选择多个输入,POST像这样的值:option1,option2,option3等..
如何将此转换为'option1','option2','option3'等的最佳方式...
我正在这样做,但感觉不对?
$variable=explode(",", $variable);
$variable=implode("','", $variable);
Run Code Online (Sandbox Code Playgroud)
我之所以这样做,是因为我想使用IN在SQL查询中使用表单选择多个输入.
SELECT * FROM TABLE WHERE some_column IN ('$variable')
Run Code Online (Sandbox Code Playgroud) 好的,我正在使用Yii2,我熟悉使用mysql查询时准备/绑定数据,例如:
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id=:some_id");
$sql->bindValue(':some_id', $some_id);
Run Code Online (Sandbox Code Playgroud)
但是,当值可能包含多个值时,例如何时使用MySQL语法IN?
例如:
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id IN (:parents)");
$sql->bindValue(':parents', $parents);
Run Code Online (Sandbox Code Playgroud)
现在据我所知,如果$parentsvar只有一个值,那么上面只会很好用; 但如果它有多个值,例如1,2,3,那么你最终会喜欢的东西'1,2,3',当你真的想要'1','2','3'OR 1,2,3.
这样做的正确方法是什么?
我正在通过切换到PDO来更新我的应用程序.我有以下代码:
$stmt = $db->prepare("select * from `product` where productid in (:productidLst)");
$stmt->bindParam(":productidLst",$productidLst, PDO::PARAM_INT);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
在上面的代码之后,var $ productidLst是1,2我想使用相当于此的PDO:
while($rs=mysql_fetch_assoc($res)){
$rs['qty']=$_SESSION['basket'][$rs['productid']];
$rs['total'] += $rs['qty']*$rs['price'];
$total += $rs['total'];
$a[] = $rs;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多组合,但没有成功,所以任何帮助这将是赞赏(在第二个代码块$ res是sql).其次我已将参数$ productidLst设置为INT这是正确的还是应该是字符串?
-------------------- UPDATE 1 ---------------------------- ------------------------
我试过以下代码:
$stmt = $db->prepare("select * from `product` where productid in (:productidLst)");
foreach ($stmt->execute(array(':productidLst' => $productidLst)) as $row)
{
$total += $row['total'];
}
Run Code Online (Sandbox Code Playgroud)
返回:为foreach()错误提供的参数无效
我能够绑定类型的值int,str,bool和null,但我无法绑定数组类型.
我已经试过这两种功能,即bindValue和bindParam,但都没有奏效.我怎么能做到这一点?
// a helper function to map Sqlite data type
function getArgType($arg) {
switch (gettype($arg)) {
case 'double': return SQLITE3_FLOAT;
case 'integer': return SQLITE3_INTEGER;
case 'boolean': return SQLITE3_INTEGER;
case 'NULL': return SQLITE3_NULL;
case 'string': return SQLITE3_TEXT;
default:
throw new \InvalidArgumentException('Argument is of invalid type '.gettype($arg));
}
}
$sql = "SELECT * FROM table_name WHERE id IN (?)";
$params = [[10, 9, 6]]; // array of array
$dbpath …Run Code Online (Sandbox Code Playgroud)