我想知道bindParam()(或bindValue())中的数据类型声明用于...
我的意思是,我认为如果我定义一个整数参数(PDO::PARAM_INT),必须将参数转换为整数,类似于
$delete->bindParam(1, $kill, PDO::PARAM_INT);
// should work like
$delete->bindParam(1, (int)$kill);
Run Code Online (Sandbox Code Playgroud)
或者如果参数不是声明的类型,至少抛出一个错误.但这种情况并非如此.
谷歌搜索,我发现在php.net档案:
大家好,
我目前正在研究PDO.正好在bindParam()函数上.第三个参数data_type似乎在这里强制值的类型?但是当我尝试:
Run Code Online (Sandbox Code Playgroud)$sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)"; $stmt = $dbh->prepare($sql); $nom = 'Testarossa'; $marque = 'Ferrari' ; $stmt->BindValue(':marque',$marque) ; $stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ; $stmt->execute(); $nom = '250 GTO' ; $stmt->execute(); ?>我希望在我的数据库中有PHP错误或整数.但在我的数据库中我有:
22 Testarossa Ferrari 23 250 GTO法拉利
这意味着如果我有第三个参数,它不会改变.或许我想念一些东西.有人能容忍我吗?或者只是有人告诉我在哪里可以找到有关它的信息.
问候,
Cyruss
这正是我的情况.我的想法出了什么问题?
我想做的就是发送一个查询
SELECT * FROM table WHERE col IN (110, 130, 90);
Run Code Online (Sandbox Code Playgroud)
所以我准备了以下声明
SELECT * FROM table WHERE col IN (:LST);
Run Code Online (Sandbox Code Playgroud)
然后我用
sqlite_bind_text(stmt, 1, "110, 130, 90", -1, SQLITE_STATIC);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这变成
SELECT * FROM table WHERE col IN ('110, 130, 90');
Run Code Online (Sandbox Code Playgroud)
并且没用(请注意另外两个单引号).我已经尝试在字符串中添加额外的'但它们会被转义.我没有找到关闭转义或防止文本被单引号括起来的选项.我能想到的最后一件事是没有使用准备好的声明,但我只把它作为最后一个选项.你有什么想法或建议吗?
谢谢
编辑:
参数的数量是动态的,因此它可能是三个数字,如上例所示,一个或十二个.
我有一个名单,例如:
List<String> names = ...
names.add('charles');
...
Run Code Online (Sandbox Code Playgroud)
并声明:
PreparedStatement stmt =
conn.prepareStatement('select * from person where name in ( ? )');
Run Code Online (Sandbox Code Playgroud)
如何做到以下几点:
stmt.setParameterList(1,names);
Run Code Online (Sandbox Code Playgroud)
有解决方法吗?谁能解释为什么这种方法丢失了?
使用:java,postgresql,jdbc3
我听说过SQLite准备好的语句可以提高性能.我写了一些代码来测试它,并没有看到使用它们的性能有任何差异.所以,我想也许我的代码不正确.如果您发现我这样做有任何错误,请告诉我......
[self testPrep:NO dbConn:dbConn];
[self testPrep:YES dbConn:dbConn];
reuse=0
recs=2000
2009-11-09 10:39:18 -0800
processing...
2009-11-09 10:39:32 -0800
reuse=1
recs=2000
2009-11-09 10:39:32 -0800
processing...
2009-11-09 10:39:46 -0800
-(void)testPrep:(BOOL)reuse dbConn:(sqlite3*)dbConn{
int recs = 2000;
NSString *sql;
sqlite3_stmt *stmt;
sql = @"DROP TABLE test";
sqlite3_exec(dbConn, [sql UTF8String],NULL,NULL,NULL);
sql = @"CREATE TABLE test (id INT,field1 INT, field2 INT,field3 INT,field4 INT,field5 INT,field6 INT,field7 INT,field8 INT,field9 INT,field10 INT)";
sqlite3_exec(dbConn, [sql UTF8String],NULL,NULL,NULL);
for(int i=0;i<recs;i++){
sql = @"INSERT INTO test (id,field1,field2,field3,field4,field5,field6,field7,field8,field9,field10) VALUES (%d,1,2,3,4,5,6,7,8,9,10)";
sqlite3_exec(dbConn, [sql UTF8String],NULL,NULL,NULL);
} …Run Code Online (Sandbox Code Playgroud) 这必须是一个新手的错误,但我没有看到它.以下是我的代码中的代码段:
$mysqli = mysqli_connect($dbCredentials['hostname'],
$dbCredentials['username'], $dbCredentials['password'],
$dbCredentials['database']);
if ($mysqli->connect_error) {
throw new exception( 'Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
$stmt = $mysqli->prepare("SELECT DISTINCT model FROM vehicle_types
WHERE year = ? AND make = '?' ORDER by model");
$stmt->bind_param('is', $year, $make);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
当我回显$ year和$ make的值时,我看到了值,但是当我运行这个脚本时,我得到一个空值,并且我的日志文件中出现以下警告:
PHP Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement
Run Code Online (Sandbox Code Playgroud)
在这种情况下,year在数据库中的类型为int(10),并且我已经尝试传递一个已经转换为int的副本,而make是一个带有utf8_unicode_ci编码的varchar(20).我错过了什么吗?
在另一个问题中有评论说:
"当谈到数据库查询时,总是尝试使用准备好的参数化查询.mysqli和PDO库支持这一点.这比使用诸如mysql_real_escape_string之类的转义函数更安全."
所以,我想问的是:为什么准备参数化查询更安全?
我正在尝试使用预准备语句来设置表名以从中选择数据,但是在执行查询时我一直收到错误.
错误和示例代码显示如下.
[Microsoft][ODBC Microsoft Access Driver] Parameter 'Pa_RaM000' specified where a table name is required.
private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [?]"; //?=date
public Execute(String reportDate){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(Display.DB_MERC);
PreparedStatement st = conn.prepareStatement(query1);
st.setString(1, reportDate);
ResultSet rs = st.executeQuery();
Run Code Online (Sandbox Code Playgroud)
关于可能导致这种情况的任何想法?
我知道使用的优点PreparedStatement,这些都是
但我想知道我们何时使用它而不是Statement?
我试图在这个准备好的语句中绑定一个变量,但我一直收到错误:
Call to a member function bind_param() on a non-object
Run Code Online (Sandbox Code Playgroud)
调用该函数,并将变量传递给它.当我将函数更改为仅回显变量时,变量在页面上打印正常,但如果我尝试在此处绑定它,则会收到错误.有人可以帮忙吗?
//CALL FROM PAGE ONE
check($username);
//FUNCTION ON PAGE 2
function check($username){
$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);
}
Run Code Online (Sandbox Code Playgroud)
我知道这里没有完全写出这个功能,但这应该不是问题.我不明白为什么我收到这个错误.
我找不到像这样的方法
char c ='c';
preparedStatement.setChar(1,c);
如何将字符设置为准备好的语句?