Testen, ob string könnte sein, boolean in PHP
Ich bin immer ein string aus $_GET und ich möchte, um zu testen, ob es ein boolean, bevor ich es verwenden, für einen Teil der mysql-Abfrage. Gibt es einen besseren Weg, es zu tun als:
function checkBool($string){
$string = strtolower($string);
if ($string == "true" || $string == "false" ||
$string == "1" || $string == "0"){
return true;
}
else {
return false;
}
}
if (checkBool($_GET['male'])){
$result = mysql_query(
"SELECT * FROM my_table " .
"WHERE male='".$_GET['male']."'") or die(mysql_error());
}
- Das wird nicht funktionieren, sowieso. Was ist Ihre Spalte Typ für
male
? Der MySQL-Typ "boolean" ist wirklich nur ein tinyint(1) also wenn das so ist, dann sollten Sie prüfen nur für 1s oder 0s. Wenn Sie char/varchar und haben zuvor auf "true", dann vergleicht man es mit "ja" oder "1" wird immer noch nicht überein. - Punkt getroffen, für die Prüfung ja und Nein, editiert mein snippet entsprechend. Spalte Typ ist in der Tat tinyint(1)! so true, false, 1 und 0 ist, was ich brauche, um zu überprüfen für
- Dies nicht wirklich etwas ändern. Werden Sie noch verwenden Sie Ihre eigene Funktion, rewrited, als ich antwortete unten.
- Die Prüfung für die string-Gleichwertigkeit wird nicht arbeiten, obwohl. Ihre SQL legt $_GET['male'] in Anführungszeichen, so dass, wenn $_GET['male'] "wahrer" Sie würden sich
SELECT * FROM my_table WHERE male='true'
. Dies wird tatsächlich zurückkehren Zeilen, in denen Männer=0, da MySQL versucht, konvertieren Sie die ZEICHENFOLGE "true", um eine Zahl, kann aber nicht, so bekommt es den Wert 0. Nehmen Sie die einfachen Anführungszeichen und es funktioniert wie erwartet. - Ich glaube, Sie haben NICHT den Punkt der Frage.
- testen Sie dies jetzt und scheinbar perfekt funktioniert
- Ich verstehe die Frage nur darauf hin, dass
SELECT * FROM my_table WHERE male='true'
vielleicht nicht so Verhalten, wie Sie erwarten würden undSELECT * FROM my_table WHERE male=true
ist, was Sie brauchen. SELECT * FROM my_table WHERE male='true'
hat nicht funktioniert als ich es versucht habe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist, durch die Art und Weise, eine bessere Möglichkeit, Sie zu schreiben:
Aber ja. Die, die Sie schrieb, ist der einzige Weg.
true
für den Dritten parameter, um einen strikten Vergleich wollen Sie NICHT haben "1.0" oder "0.0" behandelt, als ein bool.Können Sie entweder
is_bool()
oder wie vorgeschlagen auf php.net:http://php.net/manual/en/function.is-bool.php
Letztere annehmen wird Zeichenfolgen wie "auf" und "ja", wie wahr, wie gut.
is_bool()
und$b
.var_dump(is_bool("true"));
und filter_var funktioniert gut, um etwas zu verwandeln in eine Boolesche Antwort, aber ich brauchte etwas, um zu prüfen, ob string ein boolean ersteis_bool()
funktioniert mit strings: es gibt immer FALSE, ist die richtige Antwort, da die Saiten sind Saiten, nicht Boolesche Werte ;-Pfilter_var()
können verwendet werden, um zu überprüfen Zeichenketten wie "Falsch" und eine praktikable Lösung für das problem.Nein, Sie haben es, es gibt nichts mehr können Sie tun, Sie haben alle möglichen Werte, die normalerweise betrachtet werden als wahr oder falsch und du machst den Vergleich der richtige Weg, man KÖNNTE es optimieren mit einem IN_ARRAY vielleicht, aber auch so finde ich diese version doch schon ganz gut aus.
Ihre checkBool() ist ganz richtig, IMHO, wenn es ein problem mit der resultierenden SQL-code.
Sie können TRUE und FALSE, aber Sie müssen sich bewusst sein, dass Sie nicht strings:
Also wo er sagt:
... es sollte sagen:
Er würde sich besser fühlen, wenn
checkBool()
war eigentlichconvertToBool()
und Sie füttern würde deine Abfrage mit Ergebnis-Wert anstelle des ursprünglichen $_GET, aber dein code ist nicht wirklich falsch.BTW, ich gehe davon aus, dass Sie mit einem BOOL-Spalte-Typ. Dies ist, was das Handbuch sagt:
Natürlich, es ist bis zu Sie, ob BOOL, ENUM, CHAR(1) oder etwas anderes, ebenso, ob Sie zu akzeptieren
33
als synonym für WAHR 😉Wenn Sie die Flagge
FILTER_NULL_ON_FAILURE
,filter_var()
wird gut funktionieren:Für was es Wert ist, wenn Sie wirklich akzeptieren wollte "ja" oder "Nein" als gültige Eingabe vom Benutzer, dann würde ich etwas wie das hier tun:
Können Sie
is_bool
testen Sie Ihre string:is_bool
zurücktrue
nur, wenn$val
ist "Reine"true
oderfalse
, aber es wird zurückfalse
für"true"
und"false"
strings.