Home > OS >  invalid operands of types 'const char*' and const char[4]' to binary 'operator &
invalid operands of types 'const char*' and const char[4]' to binary 'operator &

Time:05-26

I am getting the below error when I use the query to insert data in a database .

This is my code :

void Journal::insert_info()
{
    //Variables
    int id_journal= getId_journal();
    string nom_journal=getNom_journal();

//Here is where the error 
    string insert_query = "INSERT INTO `info_journal`(`id_journal`, `nom_journal`, `date`, `id_fournisseur`, `id_atm`, `state`, `state_parse_journal`, `terminal`, `id_utilisateur`) VALUES ('" id_journal "','" nom_journal "',NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL )";
    //int qstate = mysql_real_query(conn,insert_query.c_str(), strlen(insert_query.c_str()));
    query_state=mysql_query(conn, insert_query.c_str());
    if(!query_state)
    {

        cout << "Query Execution Problem " << mysql_errno(conn) << endl;
    }
    else
    {
         cout << endl << "success" << endl;
    }
}

Do you have any ideas. Thank you in advance.

CodePudding user response:

Like the error message says, you can't add pointers and arrays

The problematic part is:

"INSERT ..."   id_journal   "','"

Here the literal string "INSERT ..." will decay to a pointer (const char*) and then the value of id_journal is added. This result in the pointer &(("INSERT ...")[id_journal])). In other words, the value of id_journal is used as an array index instead of being converted to a string.

You then try to add this pointer to the literal string "','" which is really a constant array of four characters (including the string null-terminator).

There no usable operator which can handle this.

The simplest solution is to turn at least one of the operands of the first addition to a std::string object. I suggest the integer variable id_journal since you can't concatenate strings with integers (there's no automatic conversion here):

string insert_query = "INSERT ...VALUES ('"   std::to_string(id_journal)   "','"   ...;

This works because there is an overloaded operator which takes a const char* on the left-hand side and a std::string on the right-hand side. Then once this is done, you have a std::string object which can be used for any further concatenations.

CodePudding user response:

The problem is that you're adding the string literal

"INSERT INTO `info_journal`(`id_journal`, `nom_journal`, `date`, `id_fournisseur`, `id_atm`, `state`, `state_parse_journal`, `terminal`, `id_utilisateur`) VALUES ('"

to an int named id_journal which results in a const char*.

Then you're trying to add this resulting const char* to the string literal "','" which is of type const char[4] but since there is no overloaded operator which takes a const char* and an const char array you end up with the mentioned error saying :

invalid operands of types ‘const char*’ and ‘const char [4]’ to binary ‘operator ’

CodePudding user response:

Thank you I just had to convert the id_journal from int to string.

There is the solution and it works.


void Journal::insert_info()
{
    Db_response::ConnectionFunction();
    //Variables
    int id_journal= getId_journal();
    //string nom_journal=getNom_journal();
    string nom_journal = find_nom_journal();
    string s_id_journal(to_string(id_journal));

    string insert_query = "INSERT INTO `info_journal`(`id_journal`, `nom_journal`, `date`, `id_fournisseur`, `id_atm`, `state`, `state_parse_journal`, `terminal`, `id_utilisateur`) VALUES ('" s_id_journal "','" nom_journal "',' '  ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' )";
    //int qstate = mysql_real_query(conn,insert_query.c_str(), strlen(insert_query.c_str()));
    query_state=mysql_query(conn, insert_query.c_str());
    if(!query_state)
    {

        cout << "Query Execution Problem " << mysql_errno(conn) << endl;
    }
    else
    {
         cout << endl << "success" << endl;
    }
}

CodePudding user response:

The problem is that you are not working with c strings but simple C string literal when doing:

string insert_query = "INSERT INTO `info_journal`(`id_journal`, `nom_journal`, `date`, `id_fournisseur`, `id_atm`, `state`, `state_parse_journal`, `terminal`, `id_utilisateur`) VALUES ('"
                        id_journal   "','"   nom_journal
                        "',NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL )";

In that line the "INSERT..." decays to a const char * as will all the other C string constants. And const char * only has operator (ptrdiff_t) that will advance the pointer.

What you can do is use C std::string literals like so and work with `std::string exclusively:

#include <string>
using namespace std::literals;

int id_journal = 42;
std::string nom_journal = "blub";

std::string insert_query = "INSERT INTO `info_journal`(`id_journal`, `nom_journal`, `date`, `id_fournisseur`, `id_atm`, `state`, `state_parse_journal`, `terminal`, `id_utilisateur`) VALUES ('"s
                             std::string::to_string(id_journal)
                             "','"s
                             nom_journal
                             "',NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL )"s;

Note: You have to convert id_journal and any other variable you want to append to the string to std::string first.

  • Related