Does your Drupal views combine filter appears to be case sensitive?

Standaard

It seems to be an issue with MySQL wich is possible to ignore by adding the following code. Just create a module and add a hook_views_query_alter in your module:

function yourmodulename_views_query_alter(&$view, &$query) {
  // Find all combine fields and make them case insensitive.
  foreach ($query->where as $group_key => $group) {
    foreach ($group['conditions'] as $key => $condition) {

          if (is_string($condition[‘field’]) && (preg_match(‘/:views_combine/’, $condition[‘field’]))) {

            $query->where[$group_key][‘conditions’][$key][‘field’] = $condition[‘field’] . ‘ COLLATE utf8_general_ci’;
        }
    }
  }
}

More info can be found on:

https://drupal.org/comment/7998079#comment-7998079

Advertenties

Ook in MySQL kan je een e-mail valideren!

Standaard

IF(x.email NOT REGEXP ‘^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$’,’invalid’,”)

Hoe kan je het vorig, huidig en volgend record ophalen met behulp van MySQL?

Standaard

Het idee dat dit mogelijk moest zijn met behulp van MySQL hield me al een hele tijd bezig en eureka we zijn er. Hoe hebben we dit opgelost?

1. Ga ervan uit dat je de filter hebt voor het huidige record

Bijvoorbeeld

q.id = 40534

2. Neem de query waarmee de gegevens worden opgehaald

Bijvoorbeeld

select q.*
from queue q
where q.id in (40531,40532,40533,40534,40535,40536,40537,40538,40539,40540)

3. Voeg daar de volgende regels aan toe aan de select- en de from-clausule

Waarbij we de rownum per record bepalen en in een paar If statements controleren op onze filter (zie punt 1) en op basis hiervan de volgende rownum en vorige rownum bepalen.

@rownum:=@rownum+1,
if(q.id = 40534,@rownum,0) as activerow,
if(q.id = 40534,@rownext := @rownum + 1,0) as nextrow,
if(q.id = 40534,@rowprev := @rownum – 1,0) as prevrow,

En de variabelen intialiseren in de from

(SELECT @rownum:=0) r, (SELECT @rownext:=0) n, (SELECT @rowprev:=0) p

4.  Maak van deze query een subquery

select x.activerow, x.nextrow, x.prevrow from (

/* de query die in stap 1, 2 & 3 is samengesteld */

) x

5. Gebruik de query uit stap 2 opnieuw en voeg volgende regels toe aan de select- en de from-clausule

Dit aan de select

(@hrownum:=@hrownum+1) as hqrow, 

en deze aan de from

(SELECT @hrownum:=0) hr

6. Gebruik deze query uit stap 5 en controleer met behulp van een exists of de hqrow van de query overeenkomt met de vorige, huidige & volgende rownum van de query uit stappen 1-4

Uiteindelijk krijg je dan het volgende resultaat als voorbeeld:

select y.* from
(
select
(@hrownum:=@hrownum+1) as hqrow,
qh.*
from queue qh, (SELECT @hrownum:=0) hr
where qh.id in (40531,40532,40533,40534,40535,40536,40537,40538,40539,40540)
) y
where exists
(
select x.activerow, x.nextrow, x.prevrow from (
select
@rownum:=@rownum+1,
if(q.id = 40534,@rownum,0) as activerow,
if(q.id = 40534,@rownext := @rownum + 1,0) as nextrow,
if(q.id = 40534,@rowprev := @rownum – 1,0) as prevrow,
q.*
from queue q, (SELECT @rownum:=0) r, (SELECT @rownext:=0) n, (SELECT @rowprev:=0) p
where q.id in (40531,40532,40533,40534,40535,40536,40537,40538,40539,40540)
) x
where x.id = 40534
and (
x.activerow = y.hqrow or
x.nextrow = y.hqrow or
x.prevrow = y.hqrow
)
)

Veel query genot!