El código de mi complemento de WordPress se ve así:
$table = $wpdb->prefix."cf_form_entry_values"; $where = "entry_id = ".$entryid; $select = "SELECT id FROM {$table} WHERE {$where}"; $query = $wpdb->prepare( $select ); $result = $wpdb->get_results( $query );Produce la siguiente consulta mysql: SELECCIONE id DE wpqs_cf_form_entry_values DONDE entry_id = 49
WordPress devuelve una matriz vacía. No se informaron errores de SQL (tengo show_errors() configurado), var_dump está vacío. Pero si corto y pego esa consulta en phpMyAdmin, devuelve las filas esperadas. No entiendo por qué WordPress me da resultados vacíos. También probé SELECCIONAR * DESDE wpqs_cf_form_entry_values DONDE entry_id = 49
He notado que si elimino la cláusula WHERE, WordPress está feliz de devolverme la tabla completa, pero ¿por qué no puedo filtrarla con una cláusula WHERE?
MÁS INFORMACIÓN TRAS PRUEBAS ADICIONALES... Es curioso lo que funciona y lo que no.
Estas dos consultas no funcionan:
SELECT * FROM wpqs_cf_form_entry_values WHERE entry_id = 55 AND slug = 'photo' SELECT * FROM wpqs_cf_form_entry_values WHERE entry_id = 55Pero este lo hace:
SELECT * FROM wpqs_cf_form_entry_values WHERE slug = 'photo'He intentado poner el valor de entry_id entre comillas y sin ellas. ¿Esa información adicional ayuda a alguien?
¿Podría intentar agregar este código?
$wpdb->show_errors( true )Tal vez luego muestre alguna información sobre por qué no funciona. ¿Intentó escribir sin variables de PHP, como una cadena completa?
También intente poner la tabla en qoutes
SELECT * FROM `wpqs_cf_form_entry_values`También he notado que falta entry_id en SELECT. Deberías tenerlo así:
SELECT id,entry_id FROM `wpqs_cf_form_entry_values`También intente poner en la parte superior del archivo
global $wpdb$where = "entry_id = ".$entryid; Supongo que $entryid debería estar envuelto en ''
La declaración de selección no se configura correctamente para el wpdb->prepare() .
$wpdb->prepare() necesita 2 argumentos. 1) la declaración de selección 2) los valores que son variables en la declaración.
Donde el valor es un dígito:
"select * from table where id = %d";Donde valor es una cadena:
"select * from table where name = %s";Donde el valor es un "flotante":
"select * from table where id = %f";Donde el valor es una mezcla (cualquier número o mezcla es posible):
"select * from table where id = %d OR name = %s OR price = %f"; %d , %s , %f son los únicos 3 valores que deben ir en una instrucción de selección que se enviará a wpdb->prepare()
En su caso, ASUMIENDO que entry_id es un número entero, la declaración debe crearse de la siguiente manera:
$table = $wpdb->prefix."cf_form_entry_values"; $where = "entry_id = %d"; $select = "SELECT id FROM $table WHERE $where"; El segundo parámetro es el valor o valores para reemplazar los "formatos sprintf". Estos deben estar en el orden en que aparecen en la declaración de selección. En su caso, el único valor es $entryid . Paso estos valores en una matriz, pero se pueden pasar individualmente. En su caso, pasaría la instrucción select y el $entryid de la siguiente manera:
$prepared_statement = $wpdb->prepare( $select,[$entryid] ); $results = $wpdb->get_results($prepared_statement); Tenga en cuenta que he cambiado su variable $result a $results ya que $wpdb->get_results() es para devolver varias filas. Si espera una sola fila, es mejor usar $wpdb->get_row() con su declaración preparada.
MÁS INFORMACIÓN:https://developer.wordpress.org/reference/classes/wpdb/prepare/