我想将PDO INSERT和UPDATE准备好的语句切换到INSERT和ON DUPLICATE KEY UPDATE,因为我认为它比我目前正在做的更有效率,但是我在找出正确的语法时遇到了麻烦.与命名占位符和bindParam一起使用.
我在SO上发现了几个类似的问题,但我是PDO的新手,无法根据我的标准成功调整代码.这是我尝试过的,但它不起作用(它不插入或更新):
try {
$stmt = $conn->prepare('INSERT INTO customer_info (user_id, fname, lname) VALUES(:user_id, :fname, :lname)'
'ON DUPLICATE KEY UPDATE customer_info SET fname= :fname,
lname= :lname
WHERE user_id = :user_id');
$stmt->bindParam(':user_id', $user_id);
$stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR);
$stmt->bindParam(':lname', $_POST['lname'], PDO::PARAM_STR);
$stmt->execute();
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码的简化版本(我有几个查询,每个查询有20-50个字段).我当前正在更新并检查更新的行数是否大于0,如果没有则运行Insert,并且每个查询都有自己的bindParam语句集.
php pdo prepared-statement sqlbindparameter on-duplicate-key
所以我有这个巨大的头痛诱导查询,我需要执行涉及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, …Run Code Online (Sandbox Code Playgroud) 我需要在PHP中使用绑定参数在MySQLi PDO中执行这个mysql查询:
mysql_query("INSERT INTO `posts` (post_name,publish_date) VALUES ($post_name,NOW()) ")
Run Code Online (Sandbox Code Playgroud)
我使用这样的脚本,但它没有正确插入publish_date.
$publish_date = 'NOW()';
$insert = $mysqli->prepare("INSERT INTO posts (post_name,publish_date) VALUES (?,?)");
$insert->bind_param("ss", $post_name $publish_date);
$insert->execute();
Run Code Online (Sandbox Code Playgroud)
它将记录插入到publish_date列中,如下所示:0000-00-00 00:00:00
我该怎么做?提前致谢.
PS:日期列的类型是datatime.
我试图将params绑定到INSERT INTO MySQLi预处理语句,如果该变量存在,否则插入null.然后我知道
type variable i corresponding variable has type integer d corresponding variable has type double s corresponding variable has type string b corresponding variable is a blob and will be sent in packets
但是当我插入一个变量= null时,我如何定义变量的类型?或者我应该定义类型''?
我正在尝试动态绑定mysql_stmt参数并在关联数组中获取结果.我在stackoverflow上找到了这篇文章,其中Amber发布了以下代码的答案:
原帖: 如何用准备好的语句制作一个合适的mysqli扩展类?
"假设你实际上想要编写自己的版本(而不是利用其他答案所建议的现有库之一 - 那些也是很好的选择)......
以下是一些您可能会发现有用的功能.第一个允许您将查询的结果绑定到关联数组,第二个允许您传入两个数组,一个是有序的键数组,另一个是这些键的数据的关联数组,并将数据绑定到准备好的声明:"
function stmt_bind_assoc (&$stmt, &$out) {
$data = mysqli_stmt_result_metadata($stmt);
$fields = array();
$out = array();
$fields[0] = $stmt;
$count = 1;
while($field = mysqli_fetch_field($data)) {
$fields[$count] = &$out[$field->name];
$count++;
}
call_user_func_array(mysqli_stmt_bind_result, $fields);
}
function stmt_bind_params($stmt, $fields, $data) {
// Dynamically build up the arguments for bind_param
$paramstr = '';
$params = array();
foreach($fields as $key)
{
if(is_float($data[$key]))
$paramstr .= 'd';
elseif(is_int($data[$key]))
$paramstr .= 'i';
else
$paramstr .= 's';
$params[] = $data[$key];
}
array_unshift($params, $stmt, …Run Code Online (Sandbox Code Playgroud) 正如标题所说,使用bind_param()时是否必须转义用户输入?还是内部完成?
谢谢.
简单来说,有人可以解释我在这里做错了什么 - 我只是试图插入带有prepare和bindParam的数据库,这是在所有字段中插入0和Null.
$sql = $db->prepare("INSERT INTO db_fruit VALUES (id=? ,type=? ,colour=?)");
$sql->bindParam(1, $newId);
$sql->bindParam(2, $type);
$sql->bindParam(3, $colour);
$sql->execute()
Run Code Online (Sandbox Code Playgroud)
顺便说一句:这个方法一直在为UPDATE等工作,但在这种情况下不适用于INSERT
以下是变量的声明:
string strFirstName;
string strLastName;
string strAddress;
string strCity;
string strState;
double dblSalary;
string strGender;
int intAge;
Run Code Online (Sandbox Code Playgroud)
...做一些"cin"语句来获取数据......
retcode = SQLPrepare(StatementHandle, (SQLCHAR *)"INSERT INTO EMPLOYEE ([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES (?,?,?,?,?,?,?,?)", SQL_NTS);
retcode = SQLBindParameter(StatementHandle, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 50, 0 &strFirstName,0, NULL);
retcode = SQLBindParameter(StatementHandle, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 50, 0, &strLastName,0, NULL);
retcode = SQLBindParameter(StatementHandle, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 30, 0, &strAddress,0, NULL);
retcode = SQLBindParameter(StatementHandle, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 30, 0, &strCity,0, NULL);
retcode …Run Code Online (Sandbox Code Playgroud) 我有这个问题:我正在使用PDO预处理语句....我想BIND变量但是如果变量为NULL则必须在MYSQL中插入字段的DEFAULT VALUE ...
我正在尝试使用IFNULL(:User_Login__Is_Active,DEFAULT),我也尝试过:COALESCE(:User_Login__Is_Active,DEFAULT),相同错误:PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL中有错误句法;
你怎么能这样做?
看这个例子:
$stmt = $this->pdo->prepare('INSERT INTO user_login
( User_Login__ID,
User_Login__Is_Active,
User_Login__Created_Date )
VALUES (
:User_Login__ID,
IFNULL(:User_Login__Is_Active, DEFAULT),
:User_Login__Created_Date )');
$stmt->bindParam(':User_Login__ID', $this->User_Login__ID, PDO::PARAM_INT);
$stmt->bindParam(':User_Login__Is_Active', $this->User_Login__Is_Active, PDO::PARAM_STR, 100);
$stmt->bindParam(':User_Login__Created_Date', $this->User_Login__Created_Date, PDO::PARAM_STR, 100);
$this->User_Login__Is_Active = null;
Run Code Online (Sandbox Code Playgroud) 我有一个关于perl DBI的bind_param的问题.以下SQL工作原理:
my $sth = $dbh->prepare("SELECT id FROM table WHERE id = 'string'");
$sth->execute();
Run Code Online (Sandbox Code Playgroud)
虽然以下不是:
my $sth = $dbh->prepare("SELECT id FROM table WHERE id = ?");
$sth->execute('string');
Run Code Online (Sandbox Code Playgroud)
上次查询导致的错误是[ODBC SQL Server Driver][SQL Server]The data types nvarchar(max) and ntext are incompatible in the equal to operator. (SQL-42000).
似乎是bind_param,被调用execute,将'string'强制转换为ntext.我该如何解决这个问题?