2012-07-06 5 views
2

Le petit module parfait pour ce que je cherche à faire a été fait pour drupal 6 mais à mon grand désarroi ça ne marche pas sur drupal 7. J'ai appris que drupal 7 a une nouvelle API pour la base de données . J'ai essayé de le faire fonctionner mais je suis certainement hors de ma ligue ici. J'espère que quelqu'un pourrait me donner un peu de conseils. Plus précisément avec la requête db_query.Drupal 7 db_query

function webform_image_validation_webform_validation_validate($validator_name, $items, 
$components, $rule) { 
$errors = array(); 
if ($items) { 
switch ($validator_name) { 
    case 'max_image_size': 
    $dimensions = explode('x', $rule['data']); 
    foreach ($items as $key => $val) { 
     if (is_numeric($val['_fid'])) { 
     $result = db_query("select * from {files} where fid = %d", $val['_fid']); 
     while ($data = db_fetch_object($result)) { 
      $thefile = $data; 
     } 
     $image_info = image_get_info($thefile->filepath); 
     if (webform_image_validation_validate_image($image_info, $dimensions[0], $dimensions[1], FALSE) === FALSE) { 
      $errors[$key] = t('Your image did not match the required width and/or height. (') . $dimensions[0] . t(' x ') . $dimensions[1] . t(')'); 
     } 
     } 
    } 

C'est l'erreur que je reçois.

Argument 2 passed to db_query() must be an array, string given, called in 
/home/designco/public_html/dev/sites/all/modules/webform_image_validation/ 
webform_image_validation.module on line 69 and defined in 
/home/designco/public_html/dev/includes/database/database.inc on line 2310 

Il semble que j'ai besoin d'ajouter un tableau mais je me perds là. Toute aide serait appréciée. J'essaie juste de savoir si je suis sur la bonne voie.

+0

http://drupal.stackexchange.com/ – madth3

Répondre

14

db_query fonctionne différemment dans drupal7.


$result = db_query("select * from {files} where fid = %d", $val['_fid']); 
while ($data = db_fetch_object($result)) { 
    $thefile = $data; 
} 
becomes
 
$results = db_query("select * from {files} where fid = :fid", array(':fid' => $val['_fid'])); 
foreach($results as $result) { 
    // Do your thing for each result. 
} 

1

Essayez de changer

$result = db_query("select * from {files} where fid = %d", $val['_fid']); 
while ($data = db_fetch_object($result)) { 
    $thefile = $data; 
} 

à

$query = db_select('files', 'f') 
    ->fields('f') 
    ->condition('fid', $val['_fid']); 
$thefile = $query->execute()->fetchObject(); 

API Les bases de données Drupal 7 docs http://drupal.org/node/310069

+0

Je suis allé de l'avant et j'ai essayé, mais maintenant obtenir cette erreur. J'apprécie l'aide. 'DOException: SQLSTATE [42S02]: table de base ou vue introuvable: 1146 La table 'designco_drupal.files' n'existe pas: SELECT f. * FROM {fichiers} f WHERE (fid =: db_condition_placeholder_0); Array ([: db_condition_placeholder_0] => 8) ' –

+0

Il n'y a pas de table' {files} 'dans Drupal 7, elle a été renommée' {file_managed} ' – Clive

+0

Ah, bien sûr! J'aurais dû le réaliser. Remplacez simplement db_select ('fichiers', 'f') par db_select ('file_managed', 'f') –

1

merci JurgenR pour la réponse. Juste pour ajouter une chose: En drupal 6, nous utilisons '% s' pour les chaînes. En drupal 7, c'est pareil pour tous. Par exemple:

$results = db_query("select * from {files} 
where filename = :fname", array(':fname' => $filename)); 

Si vous souhaitez rechercher des enregistrements à partir d'un motif alors la requête sera:

$results = db_query("select * from {files} 
where filename = :fname", array(':fname' => $filename.'%')); 

Espérons que cela est utile.