Php 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

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 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
   ***/
}