2012-09-12 36 views
0

名称键值 。 。 。 。 。 。 用户名进行更新Perl DBI mysql更新

#!/usr/bin/perl -w 
# Use the DBI module 

use strict; 
use warnings; 
use DBI; 

# CONFIG VARIABLES 
my $platform = "mysql"; 
my $database = "prod"; 
my $host  = "localhost"; 
my $username = "root"; 
my $password = "admin"; 

# DATA SOURCE NAME 
my $dsn = "dbi:$platform:$database:$host"; 

# PERL DBI CONNECT 
my $connect = DBI->connect($dsn, $username, $password); 

# VARS for Examples 
my $query; 
my $query_handle; 
my $id; 
my $demo; 

# Example 2 using do() UPDATE 

# SAMPLE VARIABLE AND VALUES TO PASS INTO SQL STATEMENT 
$id = "username"; 
$name = "Arty"; 

# do() THE UPDATE 
$query  = "UPDATE jos_config SET values = '$name' WHERE namekey = $id;"; 
$query_handle = $connect->prepare($query); 

# EXECUTE THE UPDATE 
$query_handle = $connect->do($query); 

print STDERR "ERROR: $DBI::errstr"; 
print STDERR "INFO: $query_handle rows updated"; 

undef $query; 

错误消息:

DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values = 'Arty' WHERE namekey = smtp_username' at line 1 at /home/arty/Documents/SmtpDbchange2.pl line 40. 
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values = 'Arty' WHERE namekey = smtp_username' at line 1Use of uninitialized value $query_handle in concatenation (.) or string at /home/arty/Documents/SmtpDbchange2.pl line 43. 

请协助

+3

如果你调用'做($查询)'那么你并不需要调用'准备($查询)','做( )'在语句执行之前就准备好了。 –

+0

推荐'DBI-> connect($ dsn,$ u,$ p,{RaiseError => 1})' - 这会为你带来错误。例如,它会在你的(多余的)'prepare()'中出现语法错误。 – pilcrow

回答

5

你的语法错误来自于一个事实,即“价值”是SQL的保留字。您需要报价该令牌时,它被用作一个标识符:

UPDATE jos_config SET `values` = ... 

一般情况下,MySQL的显示的只是其中的语法错误是在查询摘录的开始,因为它为你做。

您的下一个问题是您没有正确引用您与namekey比较的文字值,并且该文字值看起来像是标识符而不是MySQL的字符串。这里的解决方案是忘记插变量和使用参数化查询:

$connect->do('UPDATE jos_config SET `values`=? WHERE namekey=?', undef, $name, $id); 
0

看起来你缺少周围的namekey值的$ id一些引号:

$query = "UPDATE jos_config SET values = '$name' WHERE namekey = '$id';"; 
0

如果您遇到这样的错误,请打印出违规声明:

print $query; 

表示:

UPDATE jos_config SET values = 'Arty' WHERE namekey = username; 

然后盯着它,直到你看到丢失的报价。

然后停止做它的方式和使用的占位符:

$query = "UPDATE jos_config SET values=? WHERE namekey=?;"; 
$query_handle = $connect->prepare($query); 
my $result = $connect->do($query, {}, $name, $id); 
+1

这是一个问题,但这不是直接的问题。看到我的答案。 (另外,不需要'prepare()',不使用'$ query_handle'。) – pilcrow