db_prefix_tables és a {} jelek

pentike képe

Sziasztok!

Egy régi adatbázist migrálgatok 5-ös alá és úgy alakult, hogy cck mezőkkel oldottam meg az új tartalmat, ami az adatbázisban szerializált php cuccokat tárol, tehát tele van {} jelekkel.

Namármost ugye ezek a drupal tábla escape karakterei és a db_prefix_tables() szépen kigyomlálja őket.

Van valami elegáns megoldás erre? - Én most átírtam a core-t, hogy működjön, végülis csak ideiglenesen van rá szükség:

db_prefix_tables($sql) {
 
...
 
  else {
    $sql = strtr($sql, array('\{' => 'ŁŁcurly_brace_leftłł', '\}' => 'ŁŁcurly_brace_rightłł'));
    $sql = strtr($sql, array('{' => $db_prefix, '}' => ''));
    $sql = strtr($sql, array('ŁŁcurly_brace_leftłł' => '{', 'ŁŁcurly_brace_rightłł' => '}' ));
    return $sql;
  }
Fórum: 
pp képe

Mutatnál egy példát, mert szerintem valamit nagyon nem jól csinálsz!

Egyébiránt miért nem a node_save függvényt használod?

pp

0
0
pp képe

Na belenéztem a database.inc-be.

90%, hogy Te nem megfelelően használod a db_query-t.

helytelen:

db_query("SELECT * FROM {tabla} WHERE id=$id and akarmi LIKE '%$akarmi%'");

helyes:

db_query("SELECT * FROM {tabla} WHERE id=%d and akarmi LIKE '%%%s%%'",$id,$akarmi);

Nézd meg a db_query-t, és látni fogod, hogy előbb a táblaneveket szedi ki(db_prefix_tables), majd a változókat cseréli(_db_query_callback) és megfelelően eszképeli. (pl. szövegnél mysql-nél ' helyett \' oracle-nél ' helyett '' kell.)

function db_query($query) {
  $args = func_get_args();
  array_shift($args);
  $query = db_prefix_tables($query);
  if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
    $args = $args[0];
  }
  _db_query_callback($args, TRUE);
  $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
  return _db_query($query);
}

Ja és ne felejtsük el, hogy az SQL szabvánnyal szemben, Drupal-ban mindig nagybetűsek az SQL kulcsszavak.

Érdemes elolvasni a Drupal SQL kódolási szabályait
röviden a lényeg:

  • UPPERCASE reserved words
  • lowercase table, column and constraint names.
  • enclose each table name with {} (this allows Drupal to prefix table names).
  • all literal values should move out of query body, which escape as %d|%s|%%|%f|%b, when using db_query(), db_query_range(), and db_query_temporary().
  • Any string literal or %s placeholder must be enclosed by single quotes: ' Never use double quotes.

Magyar szerűen(nem vagyok egy műfordító alkat.):

  • A foglalt szavak/kulcsszavak mindig nagybetűsek
  • Kisbetűsek a tábla, oszlop és kényszer(? ezmiez constraint) nevek.
  • Minden tábla nevet {} jelek közé kell írnod (Ez teszi lehetőv a Drupal számára a prefixek használatát).
  • Az összes változó értéket ki kell szedni a query-ből és escapel-ni kell a következő jelekkel: %d|%s|%%|%f|%b, amikor a következő függvényeket használod: db_query(), db_query_range() és db_query_temporary().
  • Minden szöveg változót vagy %s jelölőt aposztrófok(') közé kell zárni. Soha ne használj idézőjelet/dupla aposztrófot (")

pp

0
0
pentike képe

A lekérdezés:

    $query_filed_instance_insert = "insert into {node_field_instance} values ('"
      .
      $field_name .
      "', 'modular_device', 0, '". $label ."', 'text', 'a:3:\{s:13:\"default_value\";a:1:\{i:0;a:1:\{s:5:\"value\";s:0:\"\";\}\}s:17:\"default_value_php\";s:0:\"\";s:4:\"rows\";s:1:\"1\";\}', 'a:3:\{s:5:\"label\";a:1:\{s:6:\"format\";s:6:\"inline\";\}s:6:\"teaser\";a:1:\{s:6:\"format\";s:6:\"hidden\";\}s:4:\"full\";a:1:\{s:6:\"format\";s:7:\"default\";\}\}', ''
  );";
 
db_query($query_filed_instance_insert);

Az a bajom, hogy a db_prefix_tables() kiszedi a tartalmamból is a {} -t

0
0
pentike képe

Igazad van, ha változóba rakom a szöveget, akkor nem fogja kiszedni.

0
0
Sweetchuck képe

Nem tartozik szorosan a témához, és már lehet hogy nem is aktuális, de az utókor kedvéért megjegyezném hogy a pager_query() használata esetén külön figyelni kell az SQL utasításon belüli sortörésekre.
Helytelen:

  $sql = "
    SELECT
        field_1,
        field_2
      FROM
        {tablename_1}
      WHERE
        field_3 = '%s'
  ";
  $db_result = pager_query($sql, 10, 0, NULL, 'valami');

Helyes:

  $sql = "SELECT field_1, field_2 FROM {tablename_1} WHERE field_3 = '%s'";
  $db_result = pager_query($sql, 10, 0, NULL, 'valami');

Ha jól emlékszem akkor a Drupal 4.6-os volt az aktuális.
Egy bő fél napom ráment mire rájöttem, hogy az első változat miért nem működött.
Illetve mindenféle hibaüzenet nélkül működött, csak éppen a lapozó linkek nem jelentek meg. Az a string kezelő rész ami a SELECT és FROM közötti mezőneveket lecseréli a COUNT(*) aggregátor függvényre, nem vette figyelembe a sortöréseket.

0
0