dedlfix: PDO problem mit BIT-Werten und prepared Statements

Beitrag lesen

Tach!

So übergebe ich (was nicht funktioniert, trotz $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

MySQL hat eingebauten Support für Prepared Statements, du musst sie nicht emulieren.

$rigths=1111111111111111111111111111111111111111111111111111111111111111;

Kann es sein, dass dein Integer hier überläuft, sprich größer als PHP_INT_MAX wird? Und bist

PHP kennt ab 5.4 auch eine Literalschreibweise für Binärwerte: 0b10101010;

Nun ist das problem, dass die bitweise operation nur dann funktioniert, wenn die rechte entweder als Zahl oder als BitWert übergeben wurden.

Was hindert dich an der Übergabe einer Zahl, die deine Bitfolge repräsentiert?

Wenn ich die BIT-Folge direkt übergeben möchte, muss ich dieser ja ein " b' " voranstellen.

Ich könnte nun

$rigths=1111111111111111111111111111111111111111111111111111111111111111;
$queryVars->clause .= " AND (b'".$rights."  & mg.group = mg.group OR kta_modules.modulgroup=0)";

notieren, was aber höchst unsicher ist.

Nein, warum? Wenn du eine Zahl garantierst, kann da keine Unsicherheit in Form einer SQL-Injection auftreten.

ich habe versucht

$rigths=1111111111111111111111111111111111111111111111111111111111111111;
$queryVars->clause .= " AND (b':RIGHTS  & mg.group = mg.group OR kta_modules.modulgroup=0)";
$queryVars->preparedVars[':RIGHTS']=$rights;

Das mixt die Literalschreibweise und Prepared Statement und kann so nicht gehen. Dazu müsste MySQL erstmal die Zahl wieder in ihre Literalschreibweise übersetzen und dann erst das Statement parsen. Das Statement wird aber schon beim Prepare geparst und die Werte kommen erst später. Und zwar mit jedem Execute, wenn du mehrere abfeuerst.

$rigths=1111111111111111111111111111111111111111111111111111111111111111;
$queryVars->clause .= " AND (:RIGHTS  & mg.group = mg.group OR kta_modules.modulgroup=0)";
$queryVars->preparedVars[':RIGHTS']="b'".$rights;

Auch das kann nicht gehen, weil die Werte als Wert und nicht als Literal übergeben werden.

Bitte um Vorschläge.

Nimm richtige Zahlen.

dedlfix.