0

皆さん、良い一日を

私は単純なカウンターphp + dbを持っています。これは、追加された最後のコンテンツの参照番号をチェックし、特定のコンテンツタイプ(順序)の前の参照番号に+ 1を追加することにより、新しく追加されたコンテンツに参照番号を与えます。ref番号10になるまで正常に動作し、その後在庫があり、追加したコンテンツに10しか与えません。だから私は参照番号11と12、13、14のコンテンツを追加することはできません... drupal 7 お時間とご協力ありがとうございます。

if (empty($node->title)){
drupal_set_message('new node');

$query = db_select('node', 'n');
$query->condition('n.type', 'order', '=');
$query->fields('n', array('title'));
$query->orderby('title','DESC');
$query->range(0, 1);
$query->execute();
$result = $query->execute();

$record = $result->fetchAssoc();
drupal_set_message('previous order №: ' .print_r($record['title'], true));
$title = $record['title'] + 1;
drupal_set_message('order №: ' .print_r($title, true));
$form_state['node']->title = $title;
}
4

1 に答える 1

0

さて、長い議論の後、答えは次のとおりです。

英数字の列タイプ (varchar(255)) を使用することはできません。また、英数字の降順の並べ替えで、その列内に格納されている最大の数値が生成されることを期待することはできません。これは、10、11、3529 などの値がその列に格納されている場合でも、先頭の '9' が常に他の何よりも前に表示されるためです。

列の型を数値型に変更するか、より複雑な並べ替え戦略を使用する必要があります。その列の型を変更できない場合は、SELECT クエリで型キャストを使用して、その型キャストの結果で並べ替えることができます。ただし、このようなアプローチは非常に遅く、非効率的です。

また、アルゴリズムは安全ではないことに注意してください。トランザクションなしで作業している場合、次のインデックスを計算している間に別の挿入クエリが干渉する可能性があります。

于 2012-12-17T13:02:10.973 に答える