Php Mysql执行数据。为字符串选择什么分隔符,进一步分解以创建数组?
MySQL查询是Php Mysql执行数据。为字符串选择什么分隔符,进一步分解以创建数组?,php,mysql,Php,Mysql,MySQL查询是 SELECT CompanyName, RegistrationNumber, VatCode FROM 18_6_TransactionPartners WHERE (CompanyName = ? OR RegistrationNumber = ? OR VatCode = ?) ?替换为$data\u show\u现有记录。但最初,$data\u show\u现有记录是字符串形式的(用户输入) 最初决定创建这样的$data\u show\u existing\u
SELECT CompanyName, RegistrationNumber, VatCode
FROM 18_6_TransactionPartners
WHERE (CompanyName = ? OR RegistrationNumber = ? OR VatCode = ?)
?
替换为$data\u show\u现有记录
。但最初,$data\u show\u现有记录
是字符串形式的(用户输入)
最初决定创建这样的$data\u show\u existing\u records=$data\u show\u existing\u records$数据_a[$i].,'$数据_b[$i].,'$数据_d[$i]。','
(这是在foreach中创建的,因为$i
可能仅为0,但也可能为100)
并以此方式转换为数组
$data_show_existing_records = substr($data_show_existing_records, 0, -1);
$data_show_existing_records = explode(",", $data_show_existing_records);
但例如,对于CompanyName
用户可以输入My,company
或将一些输入留空
在这种情况下,我将得到错误SQLSTATE[HY093]:无效参数编号:绑定变量的数量与令牌的数量不匹配
。因为数组中的$data
比?
多
然后决定用
替换,
(因为假设
比,
使用更少)
但这似乎不是一个好的解决方案。什么更好(用什么作为字符串/用户输入分隔符)?可能只是需要转义,
(但如何转义)?请给我一些建议
更新
找到空输入的解决方案:$data\u show\u existing\u records=$data\u show\u existing\u records。“$data_a[$i]”,“,”。“$data_b[$i]”,”。“$data_d[$i]”,”代码>
但是如何处理,
下一次更新
为查询创建初始查询(简称代码)和数据
foreach ($num_row_1 as $i => $row) {//$num_row_1 is number of rows in user input
$query_to_show = $query_to_show. 'WHERE (CompanyName = ? OR RegistrationNumber = ? OR VatCode = ?) ';
$data_show_existing_records = $data_show_existing_records. "$data_a[$i]". '"|"'. "$data_b[$i]". '"|"'. "$data_d[$i]". '"|"';
}
例如:
$query\u to\u show=
其中(CompanyName=?或RegistrationNumber=?或VatCode=?)或(CompanyName=?或RegistrationNumber=?或VatCode=?)
及
$data\u显示现有记录=
first name”|“123”|“112233”|“second name”|“456”|“445566”|“
然后转换为数组
$data_show_existing_records = substr($data_show_existing_records, 0, -1);
$data_show_existing_records = explode('"|"', $data_show_existing_records);
然后是最后一个查询
$query_show_existing_records = "
SELECT CompanyName, RegistrationNumber, VatCode
FROM 18_6_TransactionPartners
$query_to_show
";
和准备/执行
$sql_show_existing_records = $db->prepare($query_show_existing_records);
$sql_show_existing_records->execute($data_show_existing_records);
$data_show_existing_records1 = $sql_show_existing_records->fetchAll(PDO::FETCH_ASSOC);
解决方案
将查询和数据的准备更改为以下内容:
$flag = 0;//Set as WHERE
$data_show_existing_records = array();
foreach ($num_row_1 as $i => $row) {
if($flag == 0) {
$query_to_show = $query_to_show. 'WHERE (CompanyName = ? OR RegistrationNumber = ? OR VatCode = ?) ';
$flag = 1;
}
else {
$query_to_show = $query_to_show. 'OR (CompanyName = ? OR RegistrationNumber = ? OR VatCode = ?) ';
}
$data_show_existing_records[] = $data_a[$i];
$data_show_existing_records[] = $data_b[$i];
$data_show_existing_records[] = $data_d[$i];
}
SQLSTATE[HY093]:无效参数编号:绑定变量的数量与令牌的数量不匹配
表示您提供的变量多于可以绑定到它们的?
。查看您的代码和解释,您正在创建一个逗号分隔的列表,该列表可以包含3个值,但如果恰好包含100行,则也可以包含300个值
回答您的问题:选择一个字符或一系列字符作为分隔符,这些字符不能出现在数据中。选择数据中的分隔符或数据中的“不太可能”会导致安全问题
在您的特定情况下,没有理由将数据转换为逗号分隔的字符串,然后再次将其分解为数组。只需将其直接添加到最终格式(如果要执行多个查询,最有可能是二维数组):
$output=Array();
对于($i=0;$i$row输出){
/***请回答你的问题
*$row包含此查询的3个值;下一个循环包含下3个值
***/
}
如果真正的问题只是包含用于分解的字符串的用户数据,则可以在将其添加到数组之前转义该特定字符,唯一的问题是包含该字符串的用户数据。如何逃生?嗯,但是我选择来检查MySQL中是否存在用户的输入。如果我修改了用户的输入,我就无法将…与foreach($k=>row)进行比较{
例如,我得到100次选择WHERE
。假设这将使用比一个选择WHERE或更多的资源?好吧,这就是您在问题中设置查询的方式?我不确定是否可以在(“1”、“2”、“3”、“a”、“邪恶,字符串,是邪恶的”)中使用参数
在准备好的查询中,甚至在多次阅读您的问题之后,我也无法确定这是否是您真正想要的。是的,只需要以一次执行的方式编写查询和数据。我将用解决方案更新问题
$output = Array();
for( $i = 0; $i < count( $data_a ); $i++ ) {
$output[] = Array( $data_a[$i], $data_b[$i], $data_d[$i] );
}
/*** var_dump( $output );
* Array(
* Array( 1, 2, 3 ),
* Array( 4, 5, 6 ),
* Array( 7, 8, 9 ), etc...
* );
***/
foreach( $output as $k => $row ) {
/*** Do your query
* $row contains 3 values for this query; next loop it contains the next 3 values
***/
}