3 votes

La chaîne de définition de type ne correspond pas au nombre de variables de liaison.

J'utilise une classe de base de données dynamique que j'ai construite pour tous mes projets. Je viens de commencer avec un nouveau, et la classe me pose un problème. Voici mon code, pas les détails. Mais j'ai recréé l'erreur à travers un code minimal.

function vref($arr) {
  if (strnatcmp(phpversion(),'5.3') >= 0) {//La référence est requise pour PHP 5.3+
    $refs = array();
    foreach($arr as $key => $value) $refs[$key] = &$arr[$key];
    return $refs;
  }
  return $arr;
}

$bind = 's,i,i,i,i, i,s,s,s,s, i,s,s';
$reward = ( $data['reward'] ) ? $data['reward'] : '0';
$special = '0';
$icon = '0';
$mastery = ( @$data['mastery'] ) ? 'Oui' : 'Non';
$added = time();
settype($added, 'string')
$arr = array(
        $bind,
        $data['name'],
        intval($data['cost']),
        intval($data['per']),
        intval($data['serv']),
        intval($data['earns']),
        intval($data['cp']),
        $data['cookTime'],
        $reward,
        $special,
        $icon,
        intval($data['type']),
        $mastery,
        $added );

$db = new mysqli(...);
$stmt = $db2->prepare('INSERT INTO recipe2 (
     `name`,cost,perserv,servings,earns,
     cp,cooktime,`unlock`,special,icon,
     `type`,options,added) 
   VALUES (?,?,?,?,?, ?,?,?,?,?, ?,?,?) ');
call_user_func_array( array( $stmt, 'bind_param' ), vref($arr) );

// var_dump($arr)
array(14) {
[0]=> string(25) "s,i,i,i,i,i,s,s,s,s,i,s,s"
[1]=> string(18) "Bacon Cheeseburger"
[2]=> int(15)
[3]=> int(4)
[4]=> int(13)
[5]=> int(56)
[6]=> int(6)
[7]=> string(2) "5m"
[8]=> string(1) "0"
[9]=> string(1) "0"
[10]=>int(0)
[11]=>int(0)
[12]=>string(2) "No"
[13]=>string(10) "1325300795"
}

// Liste des colonnes de la base de données
name        varchar(255)            
cost        int(10)
perserv     int(5)
servings    int(10)
earns       int(10)
cp      int(10)
cooktime    varchar(11)
unlock      varchar(255)
special     varchar(255)
icon        varchar(255)
type        int(5)
options     varchar(255)
added       varchar(12)

Erreur: Attention: mysqli_stmt::bind_param(): Le nombre d'éléments dans la chaîne de définition du type ne correspond pas au nombre de variables à lier

Et avant que quelqu'un ne dise simplement, comptez vos variables. Je l'ai fait. Probablement plus de 50 fois maintenant. Pas une blague. Il y a une heure, j'ai commencé à utiliser les variables au lieu que les données soient directement mises dans. vref() passe simplement tous les éléments du tableau en tant que variables de référence. J'ai depuis appris que les références ne doivent pas être prises à la légère. Heh. Mais je ne peux toujours pas comprendre cela, c'est frustrant.

J'ai 13 colonnes. 14 paramètres passés à bind_param().

7voto

Tony Arnold Points 342

Erreur simple... Ah. Je déteste ça. Pas mon crédit.

$bind = 'siiiiissssiss'; // Pas de virgules

0voto

Logan Serman Points 11537

Étant donné votre var_dump($arr):

[0]=> string(25) "s,i,i,i,i,i,s,s,s,s,i,s,s"
[1]=> string(18) "Bacon Cheeseburger"
[2]=> int(15)
[3]=> int(4)
[4]=> int(13)
[5]=> int(56)
[6]=> int(6)
[7]=> string(2) "5m"
[8]=> string(1) "0"
[9]=> string(1) "0"
[10]=>int(0)
[11]=>int(0)
[12]=>string(2) "No"
[13]=>int(1325298618)

Il semble que votre variable $bind doit être :

$bind = 's,i,i,i,i,i,s,s,s,i,i,s,i';

au lieu de

$bind = 's,i,i,i,i,i,s,s,s,s,i,s,s';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X