[英]PHP Replace quotation marks surrounding a string
我试图通过在构建查询之前运行一些逻辑操作来使PDO查询动态化。
但是,当当前正在构建查询时,由于我所引用的列名用引号引起来(因此,至少我认为这是问题),因此不会返回任何结果,我将如何删除字符串周围的引号?
逻辑运算与查询
// Logical comparison
if($psiA >= $psiB){
$highestPsi = "high_psi";
} else {
$highestPsi = "flow_psi";
}
if($gpmA >= $gpmB){
$highestGpm = "high_gpm";
} else {
$highestGpm = "flow_gpm";
}
var_dump($highestGpm);
var_dump($highestPsi);
// Set up query variables
if( $pVal <= 0 && $gVal <= 0) {
$sql = "SELECT * FROM pumps WHERE pump_type = :pType AND :thePsi >= :pVal AND :theGpm >= :gVal AND pump_category = :cVal";
} else {
$sql = "SELECT * FROM pumps WHERE pump_type = :pType AND :thePsi >= :pVal AND :theGpm >= :gVal AND pump_category = :cVal";
var_dump($sql);
}
// Build and execute query
$stmt = $connection->prepare( $sql );
$stmt->bindParam(':pType', $pType, PDO::PARAM_STR);
$stmt->bindParam(':pVal', $pVal, PDO::PARAM_STR);
$stmt->bindParam(':gVal', $gVal, PDO::PARAM_STR);
$stmt->bindParam(':cVal', $cVal, PDO::PARAM_STR);
$stmt->bindParam(':thePsi', $highestPsi, PDO::PARAM_STR);
$stmt->bindParam(':theGpm', $highestGpm, PDO::PARAM_STR);
$stmt->execute(array(
'pType' => $pType,
'pVal' => $pVal,
'gVal' => $gVal,
'cVal' => $cVal,
'thePsi' => $highestPsi,
'theGpm' => $highestGpm
));
我知道转储返回正确的列名,我确定我需要执行某种正则表达式来去除引号以使其正常工作。
任何指针将不胜感激。
PDO的准备好的语句只能代表数据文字 。 因此,开发人员必须自己照顾标识符-PDO对此没有帮助 。
因此,您必须使用任何其他库而不是PDO,例如safeMysql :
$sql = "SELECT * FROM pumps WHERE
pump_type = ?s AND ?n >= ?s AND ?n >= ?s AND pump_category = ?s";
$data = $db->getAll($sql, $pType, $highestPsi, $pVal, $highestGpm, $gVal, $cVal);
或者,您必须手动设置标识符格式。 要格式化标识符,必须应用以下2条规则:
进行这种格式化之后,可以安全地将$ table变量插入查询中。 因此,代码将是:
$psi = "`".str_replace("`","``",$highestPsi)."`";
$sql = "SELECT * FROM pumps WHERE pump_type = :pType AND $psi ...";
不,报价并不是真正的问题。 问题是您不能绑定任何结构元素,例如列名或表名。 您只能绑定值 。 如果您需要动态更改列名,则必须使用良好的旧字符串连接/ sprintf
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.