mysqli_stmt::bind_param():类型定义字符串中的元素数与绑定变量数不匹配
Posted
技术标签:
【中文标题】mysqli_stmt::bind_param():类型定义字符串中的元素数与绑定变量数不匹配【英文标题】:mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables 【发布时间】:2013-06-18 16:47:11 【问题描述】:因此,我需要执行涉及 65 个表单输入的大量令人头疼的查询,需要使用 mysqli 准备好的语句将其注入数据库。
我遇到的问题是它说我尝试调用bind_param
的变量数与我正在使用的“s”数不匹配。 我数了十几次,看不出我在哪里出错了。有 65 个变量和 65 个“s”。
谁能看到我遗漏的东西?还是我可能以不正确的方式使用了 bind_param 方法?
// Preparing our query statement via mysqli which will auto-escape all bad characters to prevent injection
$query3 = 'INSERT INTO datashep_AMS.COMPLETE_APPLICATIONS (
project_name,
status,
funding_requested,
project_title,
program,
county,
parish,
name_of_watercourse,
which_is_a_tributary_of,
name_of_applicant,
contact_person_or_project_supervisor,
relationship_to_organization,
business_phone,
home_phone,
email,
signature_of_thesis_or_study_supervisor,
mailing_address,
postal_code,
website,
mailing_address_for_payment,
hst_registration_no,
total_cost_dollar,
total_cost_percent,
dollar_amount_requested_from_nbwtf,
percent_amount_requested_from_nbwtf,
descriptive_summary,
background_of_organization,
mandate,
years_in_existence,
membership,
accomplishments,
previous_project_name,
previous_project_number,
previous_project_amount_received_from_nbwtf,
summary_of_activities,
summary_of_Results,
project_title_2,
reason_and_or_purpose,
objectives,
project_description,
methods,
equipment_and_materials_required,
personnel_required,
proposed_start_date,
proposed_end_date,
type_of_data_to_be_stored,
where_will_it_be_housed,
monitoring,
short_term_achievement,
long_term_achievement,
previous_studies,
required_permits,
consultants,
short_term_commitment,
long_term_commitment,
project_duration,
project_evaluation,
promotion_of_project,
promotion_of_client,
publication_of_results,
community_benefits,
effects_on_traditional_uses,
possible_changes_in_public_access_to_areas,
possible_impact_on_wildlife_and_or_environment,
likelihood_of_future_requests_for_funding,
list_all_other_funding_sources_for_this_project
) VALUES (
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?
)';
// "Preparing" the query using mysqli->prepare(query) -- which is the equivalent of mysql_real_escape_string -- in other words, it's the SAFE database injection method
$stmt = $dbConnection->prepare($query3);
// "Bind_param" == replace all the "?"'s in the aforementioned query with the variables below
$stmt->bind_param("s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s", $project_name, $status, $funding_requested, $project_title, $program, $county, $parish, $name_of_watercourse, $which_is_a_tributary_of, $name_of_applicant, $contact_person_or_project_supervisor, $relationship_to_organization, $business_phone, $home_phone, $email, $signature_of_thesis_or_study_supervisor, $mailing_address, $postal_code, $website, $mailing_address_for_payment, $hst_registration_no, $total_cost_dollar, $total_cost_percent, $dollar_amount_requested_from_nbwtf, $percent_amount_requested_from_nbwtf, $descriptive_summary, $background_of_organization, $mandate, $years_in_existence, $membership, $accomplishments, $previous_project_name, $previous_project_number, $previous_project_amount_received_from_nbwtf, $summary_of_activities, $summary_of_Results, $project_title_2, $reason_and_or_purpose, $objectives, $project_description, $methods, $equipment_and_materials_required, $personnel_required, $proposed_start_date, $proposed_end_date, $type_of_data_to_be_stored, $where_will_it_be_housed, $monitoring, $short_term_commitment, $long_term_achievement, $previous_studies, $required_permits, $consultants, $short_term_commitment, $long_term_commitment, $project_duration, $project_evaluation, $promotion_of_project, $promotion_of_client, $publication_of_results, $community_benefits, $effects_on_traditional_uses, $possible_changes_in_public_access_to_areas, $possible_impact_on_wildlife_and_or_environment, $likelihood_of_future_requests_for_funding, $list_all_other_funding_sources_for_this_project);
// Perform the actual query!
$stmt->execute();
【问题讨论】:
你从哪里得到逗号分隔的格式? 全面披露:我是初学者,所以我真的不知道更好的方法(目前)。 @SamuelStiles 我认为您真的应该考虑是否需要 数据库表中的 65 列。如果您有多个表和连接,它可能会更易于管理。 @Your 常识:php 插入查询的当前和更好的方法是什么? @SuKu 对于常规插入查询只需使用准备好的语句 【参考方案1】:bind_param
中的字符不应以逗号分隔。
如果您必须绑定两个变量,请执行以下操作:
$stmt->bind_param('ss', $firstvariable, $secondvariable);
【讨论】:
谢谢!鼓舞人心!【参考方案2】:有 65 个字符串参数,所以如果有 65 个 s,你就有正确的数字。但是出现错误是因为您用逗号分隔了 s。而不是$stmt->bind_param("s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s..."
应该是
$stmt->bind_param("sssssssssssssssss..."
这应该可以解决您的错误。
【讨论】:
【参考方案3】:字符串中的字符不能用逗号分隔:
$stmt->bind_param("sss...", /* variables */);
您可以在the manual page 的示例中看到这种格式。
【讨论】:
以上是关于mysqli_stmt::bind_param():类型定义字符串中的元素数与绑定变量数不匹配的主要内容,如果未能解决你的问题,请参考以下文章
mysqli_stmt::bind_param():类型定义字符串中的元素数与绑定变量数不匹配
call_user_func_array() - 警告:mysqli_stmt::bind_param():变量数与准备语句中的参数数不匹配