标签: prepared-statement

PHP PDO :: bindParam()数据类型..它是如何工作的?

我想知道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似乎在这里强制值的类型?但是当我尝试:

$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(); ?>
Run Code Online (Sandbox Code Playgroud)

我希望在我的数据库中有PHP错误或整数.但在我的数据库中我有:

22 Testarossa Ferrari 23 250 GTO法拉利

这意味着如果我有第三个参数,它不会改变.或许我想念一些东西.有人能容忍我吗?或者只是有人告诉我在哪里可以找到有关它的信息.

问候,

Cyruss

这正是我的情况.我的想法出了什么问题?

php pdo types prepared-statement

30
推荐指数
3
解决办法
2万
查看次数

SQLite:将值列表绑定到"WHERE col IN(:PRM)"

我想做的就是发送一个查询

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)

并且没用(请注意另外两个单引号).我已经尝试在字符串中添加额外的'但它们会被转义.我没有找到关闭转义或防止文本被单引号括起来的选项.我能想到的最后一件事是没有使用准备好的声明,但我只把它作为最后一个选项.你有什么想法或建议吗?

谢谢

编辑:

参数的数量是动态的,因此它可能是三个数字,如上例所示,一个或十二个.

sqlite select bind prepared-statement

29
推荐指数
5
解决办法
3万
查看次数

如何在准备好的语句中设置参数列表?

我有一个名单,例如:

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

java postgresql jdbc prepared-statement

28
推荐指数
2
解决办法
9万
查看次数

在SQLite中,准备好的语句真的能提高性能吗?

我听说过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)

sqlite performance prepared-statement

28
推荐指数
2
解决办法
2万
查看次数

Php mysqi bind_param变量数与预准备语句中的参数数量不匹配

这必须是一个新手的错误,但我没有看到它.以下是我的代码中的代码段:

$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).我错过了什么吗?

php mysqli prepared-statement

28
推荐指数
1
解决办法
3万
查看次数

为什么使用mysql预处理语句比使用常见转义函数更安全?

在另一个问题中有评论说:

"当谈到数据库查询时,总是尝试使用准备好的参数化查询.mysqli和PDO库支持这一点.这比使用诸如mysql_real_escape_string之类的转义函数更安全."

资源

所以,我想问的是:为什么准备参数化查询更安全?

php mysql security sql-injection prepared-statement

27
推荐指数
3
解决办法
2万
查看次数

使用Prepared Statements设置表名

我正在尝试使用预准备语句来设置表名以从中选择数据,但是在执行查询时我一直收到错误.

错误和示例代码显示如下.

[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)

关于可能导致这种情况的任何想法?

java sql prepared-statement

27
推荐指数
1
解决办法
2万
查看次数

我们什么时候应该使用PreparedStatement而不是Statement?

我知道使用的优点PreparedStatement,这些都是

  • 查询由数据库服务器重写和编译
  • 防止SQL注入

但我想知道我们何时使用它而不是Statement

java database prepared-statement

27
推荐指数
4
解决办法
3万
查看次数

在非对象上调用成员函数bind_param()

我试图在这个准备好的语句中绑定一个变量,但我一直收到错误:

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)

我知道这里没有完全写出这个功能,但这应该不是问题.我不明白为什么我收到这个错误.

php mysqli prepared-statement

27
推荐指数
3
解决办法
9万
查看次数

JDBC - 如何在预准备语句中设置char

我找不到像这样的方法

char c ='c';

preparedStatement.setChar(1,c);

如何将字符设置为准备好的语句?

java jdbc prepared-statement

27
推荐指数
2
解决办法
5万
查看次数