web-dev-qa-db-de.com

WP API, die SQL-Ergebnisse als Zeichenfolgen und nicht als Zahlen zurückgibt

Ich habe diesen Code, aber was ich im Browser erhalte, sind alle Felder - auch die als Int und Bool in SQL gespeicherten - als Zeichenfolgen.

add_action( 'rest_api_init', function () {
  register_rest_route( 'restos/v1', '/resto/(?P<qname>.*)', array(
    'methods' => 'GET',
    'callback' => 'handle_get',
    'permission_callback' => function () {
      return current_user_can( 'edit_others_posts' );
    }
  ) );
} );

function handle_get( $data ) {
    global $wpdb;
    $query = "SELECT * FROM `restaurants` WHERE `qname` = '".$data['qname']."' LIMIT 1";
    $res = $wpdb->get_results($query)[0];

    return $res;
}

Ich habe versucht, return json_encode($res), aber das hat nicht geholfen. Wie kann ich ein Objekt mit Zahlen und Booleschen Werten in json senden lassen?.

4
Simon H

Der String-Ausgabetyp wird für $wpdb-Abfrageergebnisse erwartet. Die DB-Datentypen werden nicht den entsprechenden PHP-Datentypen zugeordnet.

Sie müssen sich selbst darum kümmern, wie zum Beispiel:

$data = [
    'int'    => (int)    '123',
    'bool'   => (bool)   '1',
    'string' => (string) 'abc'
];

return rest_ensure_response( $data );

mit der restlichen Antwort:

{"int":123,"bool":true,"string":"abc"}

Hier ist ein interessanter Ansatz von Matthew Boynes, um es automatisch in wpdb mit einem benutzerdefinierten Wrapper zu behandeln.

Beachten Sie, dass Sie wpdb::get_row verwenden können, um eine einzelne Zeile abzurufen.

2
birgire