@@ -1393,6 +1393,108 @@ PHP_METHOD(sqlite3stmt, readOnly)
1393
1393
}
1394
1394
/* }}} */
1395
1395
1396
+ /* bind parameters to a statement before execution */
1397
+ static int php_sqlite3_bind_params (php_sqlite3_stmt * stmt_obj ) /* {{{ */
1398
+ {
1399
+ struct php_sqlite3_bound_param * param ;
1400
+ int return_code ;
1401
+
1402
+ if (stmt_obj -> bound_params ) {
1403
+ ZEND_HASH_FOREACH_PTR (stmt_obj -> bound_params , param ) {
1404
+ zval * parameter ;
1405
+ /* parameter must be a reference? */
1406
+ if (Z_ISREF (param -> parameter )) {
1407
+ parameter = Z_REFVAL (param -> parameter );
1408
+ } else {
1409
+ parameter = & param -> parameter ;
1410
+ }
1411
+
1412
+ /* If the ZVAL is null then it should be bound as that */
1413
+ if (Z_TYPE_P (parameter ) == IS_NULL ) {
1414
+ return_code = sqlite3_bind_null (stmt_obj -> stmt , param -> param_number );
1415
+ if (return_code != SQLITE_OK ) {
1416
+ php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1417
+ }
1418
+ continue ;
1419
+ }
1420
+
1421
+ switch (param -> type ) {
1422
+ case SQLITE_INTEGER :
1423
+ convert_to_long (parameter );
1424
+ #if ZEND_LONG_MAX > 2147483647
1425
+ return_code = sqlite3_bind_int64 (stmt_obj -> stmt , param -> param_number , Z_LVAL_P (parameter ));
1426
+ #else
1427
+ return_code = sqlite3_bind_int (stmt_obj -> stmt , param -> param_number , Z_LVAL_P (parameter ));
1428
+ #endif
1429
+ if (return_code != SQLITE_OK ) {
1430
+ php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1431
+ }
1432
+ break ;
1433
+
1434
+ case SQLITE_FLOAT :
1435
+ convert_to_double (parameter );
1436
+ return_code = sqlite3_bind_double (stmt_obj -> stmt , param -> param_number , Z_DVAL_P (parameter ));
1437
+ if (return_code != SQLITE_OK ) {
1438
+ php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1439
+ }
1440
+ break ;
1441
+
1442
+ case SQLITE_BLOB :
1443
+ {
1444
+ php_stream * stream = NULL ;
1445
+ zend_string * buffer = NULL ;
1446
+ if (Z_TYPE_P (parameter ) == IS_RESOURCE ) {
1447
+ php_stream_from_zval_no_verify (stream , parameter );
1448
+ if (stream == NULL ) {
1449
+ php_sqlite3_error (stmt_obj -> db_obj , "Unable to read stream for parameter %ld" , param -> param_number );
1450
+ return FAILURE ;
1451
+ }
1452
+ buffer = php_stream_copy_to_mem (stream , PHP_STREAM_COPY_ALL , 0 );
1453
+ } else {
1454
+ buffer = zval_get_string (parameter );
1455
+ }
1456
+
1457
+ if (buffer ) {
1458
+ return_code = sqlite3_bind_blob (stmt_obj -> stmt , param -> param_number , ZSTR_VAL (buffer ), ZSTR_LEN (buffer ), SQLITE_TRANSIENT );
1459
+ zend_string_release_ex (buffer , 0 );
1460
+ if (return_code != SQLITE_OK ) {
1461
+ php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1462
+ }
1463
+ } else {
1464
+ return_code = sqlite3_bind_null (stmt_obj -> stmt , param -> param_number );
1465
+ if (return_code != SQLITE_OK ) {
1466
+ php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1467
+ }
1468
+ }
1469
+ break ;
1470
+ }
1471
+
1472
+ case SQLITE3_TEXT :
1473
+ convert_to_string (parameter );
1474
+ return_code = sqlite3_bind_text (stmt_obj -> stmt , param -> param_number , Z_STRVAL_P (parameter ), Z_STRLEN_P (parameter ), SQLITE_STATIC );
1475
+ if (return_code != SQLITE_OK ) {
1476
+ php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1477
+ }
1478
+ break ;
1479
+
1480
+ case SQLITE_NULL :
1481
+ return_code = sqlite3_bind_null (stmt_obj -> stmt , param -> param_number );
1482
+ if (return_code != SQLITE_OK ) {
1483
+ php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1484
+ }
1485
+ break ;
1486
+
1487
+ default :
1488
+ php_sqlite3_error (stmt_obj -> db_obj , "Unknown parameter type: %pd for parameter %pd" , param -> type , param -> param_number );
1489
+ return FAILURE ;
1490
+ }
1491
+ } ZEND_HASH_FOREACH_END ();
1492
+ }
1493
+
1494
+ return SUCCESS ;
1495
+ }
1496
+ /* }}} */
1497
+
1396
1498
static int register_bound_parameter_to_sqlite (struct php_sqlite3_bound_param * param , php_sqlite3_stmt * stmt ) /* {{{ */
1397
1499
{
1398
1500
HashTable * hash ;
@@ -1548,7 +1650,7 @@ PHP_METHOD(sqlite3stmt, execute)
1548
1650
php_sqlite3_result * result ;
1549
1651
zval * object = ZEND_THIS ;
1550
1652
int return_code = 0 ;
1551
- struct php_sqlite3_bound_param * param ;
1653
+ int bind_rc = 0 ;
1552
1654
1553
1655
stmt_obj = Z_SQLITE3_STMT_P (object );
1554
1656
@@ -1561,96 +1663,11 @@ PHP_METHOD(sqlite3stmt, execute)
1561
1663
/* Always reset statement before execution, see bug #77051 */
1562
1664
sqlite3_reset (stmt_obj -> stmt );
1563
1665
1564
- if (stmt_obj -> bound_params ) {
1565
- ZEND_HASH_FOREACH_PTR (stmt_obj -> bound_params , param ) {
1566
- zval * parameter ;
1567
- /* parameter must be a reference? */
1568
- if (Z_ISREF (param -> parameter )) {
1569
- parameter = Z_REFVAL (param -> parameter );
1570
- } else {
1571
- parameter = & param -> parameter ;
1572
- }
1573
-
1574
- /* If the ZVAL is null then it should be bound as that */
1575
- if (Z_TYPE_P (parameter ) == IS_NULL ) {
1576
- return_code = sqlite3_bind_null (stmt_obj -> stmt , param -> param_number );
1577
- if (return_code != SQLITE_OK ) {
1578
- php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1579
- }
1580
- continue ;
1581
- }
1666
+ /* Bind parameters to the statement */
1667
+ bind_rc = php_sqlite3_bind_params (stmt_obj );
1582
1668
1583
- switch (param -> type ) {
1584
- case SQLITE_INTEGER :
1585
- convert_to_long (parameter );
1586
- #if ZEND_LONG_MAX > 2147483647
1587
- return_code = sqlite3_bind_int64 (stmt_obj -> stmt , param -> param_number , Z_LVAL_P (parameter ));
1588
- #else
1589
- return_code = sqlite3_bind_int (stmt_obj -> stmt , param -> param_number , Z_LVAL_P (parameter ));
1590
- #endif
1591
- if (return_code != SQLITE_OK ) {
1592
- php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1593
- }
1594
- break ;
1595
-
1596
- case SQLITE_FLOAT :
1597
- convert_to_double (parameter );
1598
- return_code = sqlite3_bind_double (stmt_obj -> stmt , param -> param_number , Z_DVAL_P (parameter ));
1599
- if (return_code != SQLITE_OK ) {
1600
- php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1601
- }
1602
- break ;
1603
-
1604
- case SQLITE_BLOB :
1605
- {
1606
- php_stream * stream = NULL ;
1607
- zend_string * buffer = NULL ;
1608
- if (Z_TYPE_P (parameter ) == IS_RESOURCE ) {
1609
- php_stream_from_zval_no_verify (stream , parameter );
1610
- if (stream == NULL ) {
1611
- php_sqlite3_error (stmt_obj -> db_obj , "Unable to read stream for parameter %ld" , param -> param_number );
1612
- RETURN_FALSE ;
1613
- }
1614
- buffer = php_stream_copy_to_mem (stream , PHP_STREAM_COPY_ALL , 0 );
1615
- } else {
1616
- buffer = zval_get_string (parameter );
1617
- }
1618
-
1619
- if (buffer ) {
1620
- return_code = sqlite3_bind_blob (stmt_obj -> stmt , param -> param_number , ZSTR_VAL (buffer ), ZSTR_LEN (buffer ), SQLITE_TRANSIENT );
1621
- zend_string_release_ex (buffer , 0 );
1622
- if (return_code != SQLITE_OK ) {
1623
- php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1624
- }
1625
- } else {
1626
- return_code = sqlite3_bind_null (stmt_obj -> stmt , param -> param_number );
1627
- if (return_code != SQLITE_OK ) {
1628
- php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1629
- }
1630
- }
1631
- break ;
1632
- }
1633
-
1634
- case SQLITE3_TEXT :
1635
- convert_to_string (parameter );
1636
- return_code = sqlite3_bind_text (stmt_obj -> stmt , param -> param_number , Z_STRVAL_P (parameter ), Z_STRLEN_P (parameter ), SQLITE_STATIC );
1637
- if (return_code != SQLITE_OK ) {
1638
- php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1639
- }
1640
- break ;
1641
-
1642
- case SQLITE_NULL :
1643
- return_code = sqlite3_bind_null (stmt_obj -> stmt , param -> param_number );
1644
- if (return_code != SQLITE_OK ) {
1645
- php_sqlite3_error (stmt_obj -> db_obj , "Unable to bind parameter number " ZEND_LONG_FMT " (%d)" , param -> param_number , return_code );
1646
- }
1647
- break ;
1648
-
1649
- default :
1650
- php_sqlite3_error (stmt_obj -> db_obj , "Unknown parameter type: %pd for parameter %pd" , param -> type , param -> param_number );
1651
- RETURN_FALSE ;
1652
- }
1653
- } ZEND_HASH_FOREACH_END ();
1669
+ if (bind_rc == FAILURE ) {
1670
+ RETURN_FALSE ;
1654
1671
}
1655
1672
1656
1673
return_code = sqlite3_step (stmt_obj -> stmt );
0 commit comments